2016-07-27 2 views
0

У меня есть следующий код XAML:Binding Для ListView и Checkbox

<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

'Группы' - это таблица или коллекция C# объектов' Group'? Надеюсь, вы делаете это MVVM. В этом случае вы можете иметь свойство 'IsChecked' в классе' Group'. – 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 заключается в том, что существует «средний» класс, который связывает вашу модель с вашим представлением.

В вашей ситуации класс модели является объектом таблицы базы данных, и ваше представление является вашим пользовательским интерфейсом.

Вам нужно написать класс ViewModel, который представляет строку в вашей таблице, и там вы можете написать любые свойства, которые вы хотите. Коллекция этих ViewModels будет вашей «средней» таблицей. Привяжите эту коллекцию к списку ListView.

Свойство GroupIsChecked не должно быть на вашем столе, поэтому вы можете реализовать свою логику в своем классе ViewModel. Возможно, вы можете присвоить GROUP_NAME более подходящее имя, например GroupName, и так далее для всех ваших столбцов в таблице.