我有以下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 :(得分:1)
MVVM的主要思想是有一个“中间”类将您的模型链接到您的视图。
在您的情况下,模型类是数据库表对象,您的视图是您的UI。
您需要编写一个表示表中行的ViewModel类,并且您可以在其中编写所需的任何属性。 这些ViewModel的集合将成为您的“中间”表。 将此集合绑定到ListView。
GroupIsChecked属性不应该在您的表上,因此您可以在ViewModel类中实现其逻辑。 也许您可以为GROUP_NAME提供更合适的名称,例如GroupName,依此类推表格中的所有列。
答案 1 :(得分: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>