2016-07-27 8 views
0

への結合:は、私は以下のXAMLコード持っているListViewコントロールとチェックボックス

<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が私のテーブルにないことと、それを真/偽に設定するいくつかの条件をチェックしたいということです。何か案が?

+0

'グループ'は 'Group'オブジェクトのテーブルまたは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のような適切な名前を付けることができます。

関連する問題