2016-07-27 9 views
0

나는 다음과 같은 XAML 코드가 :목록보기하려면 바인딩 및 체크 박스

<ListView Name="UserConfigurationListView" ItemsSource="{Binding Groups}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding Path=GROUP_NAME}" /> 
       <CheckBox IsChecked="{Binding GroupIsChecked}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListView> 

그룹 테이블 GROUP_NAME 열을 포함하지만 GroupIsChecked을 포함하지 않는 내 데이터베이스에서입니다. 지금까지 TextBlock을 표시 할 수 있었지만 Checkbox를 true/false로 설정하는 방법은 없습니다. 문제는 GroupIsChecked이 내 테이블에 없기 때문에 일부 조건을 true/false로 설정하고 싶습니다. 어떤 생각?

+0

'그룹'은'그룹'개체의 테이블 또는 C# 모음입니까? MVVM 방식으로하고 싶습니다. 이 경우'Group' 클래스에'IsChecked' 속성을 가질 수 있습니다. – niksofteng

답변

1

OrMiz는보기에 대한보기 모델을 구현하는 것이 정확합니다.

저는 MVVM 전문가가 아니지만 여기에 어떻게 할 수 있는지 보여주는 예가 있습니다. 피드백 환영합니다.

그룹 테이블을 나타내는 클래스 ...

public class GroupTable 
{ 
    [Key] 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

목록보기에서 하나 개의 행을 나타낼 수 뷰 모델 유리 ... 그런

public class GroupViewModel : INotifyPropertyChanged 
{ 
    public GroupViewModel(GroupTable group) 
    { 
     this.GroupName = group.Name; 
     this.GroupIsChecked = GroupCheckedLogic(); 
    } 

    private string _GroupName; 

    public string GroupName 
    { 
     get { return _GroupName; } 
     set 
     { 
      _GroupName = value; 
      OnPropertyChanged(); 
     } 
    } 

    private bool _GroupIsChecked; 

    public bool GroupIsChecked 
    { 
     get { return _GroupIsChecked; } 
     set 
     { 
      _GroupIsChecked = value; 
      OnPropertyChanged(); 
     } 
    } 

    private bool GroupCheckedLogic() 
    { 
     // Your logic goes here 
     return true; 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 

    } 
} 

메인 뷰 모델 보기 ... 당신의 XAML에서 그런

public class GroupListViewModel : INotifyPropertyChanged 
{ 
    public GroupListViewModel() 
    { 
     // Get your actual data 
     var groupsData = new List<GroupViewModel> 
     { 
      new GroupViewModel(new GroupTable {Id = 1, Name = "Group 1"}), 
      new GroupViewModel(new GroupTable {Id = 2, Name = "Group 2"}) 
     }; 

     this.Groups = new ObservableCollection<GroupViewModel>(groupsData); 
    } 

    private ObservableCollection<GroupViewModel> _Groups; 

    public ObservableCollection<GroupViewModel> Groups 
    { 
     get { return _Groups; } 
     set 
     { 
      _Groups = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

...

,
<ListView Name="UserConfigurationListView" ItemsSource="{Binding Groups}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding GroupName}" /> 
        <CheckBox IsChecked="{Binding GroupIsChecked}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListView> 
+0

그게 내가 의미 한거야 : – OrMiz

+0

그게 내 문제를 해결, 설명을 주셔서 감사합니다. – Michael280

1

MVVM의 주요 아이디어는 모델을 뷰에 연결하는 "중간"클래스가 있다는 것입니다.

상황에 따라 모델 클래스는 데이터베이스 테이블 개체이고보기는 사용자의 UI입니다.

테이블의 행을 나타내는 ViewModel 클래스를 작성해야하며 원하는 속성을 작성할 수 있습니다. 이러한 ViewModel의 컬렉션이 "중간"테이블이됩니다. 이 컬렉션을 ListView에 바인딩하십시오.

GroupIsChecked 속성이 테이블에 있으면 안되므로 ViewModel 클래스에 논리를 구현할 수 있습니다. GROUP_NAME에 GroupName과 같은 적절한 이름을 지정하는 등 테이블의 모든 열에 대해서도 마찬가지로 지정할 수 있습니다.