2016-07-27 84 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,但我不知道如何将复选框设置为true/false。问题是GroupIsChecked不在我的表中,我想检查一些条件以将其设置为true/false。任何想法?

+0

'Groups'是'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)); 

    } 
} 

那么对于主视图模型视图...

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)); 
    } 
} 

然后在你的XAML ...

<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,等等。