2011-01-11 7 views
1

키/값 쌍의 행을 추가/삭제/편집 할 수있는 컨트롤이 필요합니다. 이것에 가장 적합한 컨트롤은 무엇입니까? 누구든지 예제가 있습니까? 나는 WPF에 대해 아주 처음이다.키/값 쌍을 추가하는 컨트롤?

+0

는 사용자가 목록에서 기존의 키/값 쌍을 편집하거나 목록에 추가 키/값 쌍을 추가 할 수 있습니다 : 당신은 데이터 그리드 XAML에서 정상 세포 템플릿과 편집 세포 템플릿을 정의 할 수 있습니까? – devdigital

+0

@devdigital : 네, 편집도 도움이 될 것입니다. – mpen

답변

4

2 개의 레이블이 붙은 텍스트 상자로 간단한 대화를 사용하면 행이 자동으로 생성되도록 DataGrid에 바인딩되어야하는 원본 데이터에 새 쌍이 추가됩니다.

편집 : DataGrid 예제 솔루션.
XAML :

<Window 
    ... 
    DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}"> 
    <StackPanel Orientation="Vertical"> 
     <DataGrid ItemsSource="{Binding GridData}"/> 
    </StackPanel> 
</Window> 

코드 숨김 창 클래스에서
:

private ObservableCollection<Pair> gridData = new ObservableCollection<Pair>(new Pair[]{new Pair()}); 
    public ObservableCollection<Pair> GridData 
    { 
     get { return gridData; } 
    } 

쌍 클래스 :

public class Pair : INotifyPropertyChanged 
{ 
    private string key = "Key"; 
    public string Key 
    { 
     get { return key; } 
     set 
     { 
      if (this.key != value) 
      { 
       key = value; 
       NotifyPropertyChanged("Key"); 
      } 
     } 
    } 


    private double value = 0; 
    public double Value 
    { 
     get { return value; } 
     set 
     { 
      if (this.value != value) 
      { 
       this.value = value; 
       NotifyPropertyChanged("Value"); 
      } 
     } 
    } 

    public Pair() { } 
    public Pair(string key, double value) 
     : this() 
    { 
     Key = key; 
     Value = value; 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion 
} 

당신은 정상 데이터 그리드 기능과 함께 새로운 쌍을 추가 할 수 있어야한다 .

+0

텍스트 상자의 데이터 격자를 만들 수 있습니까? XAML 예제가 있습니까? WPF를 처음 사용 ... – mpen

+0

예제 솔루션이 추가되었습니다. –

+0

이것은 작동하는 것 같습니다. 고마워요! 일반적으로 WPF를 사용하면 많은 사용자 지정 컨테이너 클래스를 작성하여 INotifyPropertyChanged 또는 IObservable을 구현할 수 있습니까? – mpen

1

MVVM을 사용한다고 가정 할 때 뷰 모델에서 ObservableCollection (쌍 유형)을 사용하거나 System.Collections.Generic.KeyValuePair 유형을 사용하여 자신을 정의하지 않으려는 경우 사용할 수 있습니다.

두 쌍의 텍스트 상자를 사용하여 새 쌍을 추가 할 수 있습니다.이 쌍은 쌍 유형을 인스턴스화하여 ObservableCollection에 추가합니다. 명령을 사용하여보기 모델에서 메소드를 호출하여이를 수행 할 수 있습니다 (또는보기 모델의 동사에 단추와 같은보기 컨트롤의 관례 기반 바인딩을 지원하는 Caliburn.Micro와 같은 프레임 워크를 조사 할 수 있음).

ListBox를 사용하여 쌍의 컬렉션을 표시 할 수 있습니다. ListBox의 ItemsSource 속성을 ObservableCollection 쌍의 뷰 모델에 바인딩하면됩니다. 또는 기존 쌍의 인라인 편집을 지원하려는 경우 DataGrid를 선택하는 것이 좋습니다. DataGrid는 셀 값을 두 번 클릭하여 인라인 편집을 지원합니다.

<DataGrid ItemsSource="{Binding MyPairsCollection}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
    <DataGridTemplateColumn Header="Key"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Key}" /> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
     <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Key}" /> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellEditingTemplate> 
    </DataGridTemplateColumn> 
    ... 
    </DataGrid.Columns> 
</DataGrid> 
+0

'ObservableCollection > 변수를 사용하려고하면이 오류가 발생합니다 {get; 세트; }'내 컨테이너로 : "TwoWay 또는 OneWayToSource 바인딩은 'System.Collections.Generic.KeyValuePair'2 [System.String, System.String]'형식의 읽기 전용 속성 'Value'에서 작동하지 않습니다." - ** 편집 : ** DataGrid의 행을 두 번 클릭하면 .... (인라인 편집이 더 좋을 수도 있음) – mpen

+0

@me : KeyValuePairs에 읽기 전용 값이 있다고 생각하지 않았습니다 ... 하지만 어쩌면 그들이 할 수 있습니다.HB가 제시하는대로 자신의 키/값 유형을 구현하는 것이 답입니다. – mpen

관련 문제