2016-07-27 82 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,等等。