使用WPF对复杂对象模型进行数据绑定
本文关键字:数据绑定 对象模型 复杂 WPF 使用 | 更新日期: 2023-09-27 18:00:16
我目前正在重构一些用C#在WPF之上编写的旧代码。
我目前有一个复合用户模型,看起来像这样:
public class UserModel{
public User User {get; set;}
public List<Guid> Permissions {get; set;}
}
在此模型中,"权限"列表是授予该模型引用的用户的权限ID的列表。
在我的xaml for my user management屏幕中,我将这些模型的列表绑定到一个组合框,当选择发生更改时,所选项目将绑定到包含user属性和Items控件的文本框的网格。
当页面加载时,此项目控件中充满了绑定到系统中所有权限的复选框。我的问题是,将"权限"列表绑定到项目控件中的复选框的最佳方式是什么?
项目控制的代码看起来像这样:
<ScrollViewer Grid.Row="7" Grid.Column="1">
<ItemsControl ItemsSource={Binding}>
<ItemsControl.ItemsTemplate>
<DataTemplate>
<Checkbox Content="{Binding Description}" IsChecked="{Binding IsSelected}"/>
</DataTemplate>
</ItemsControl.ItemsTemplate>
</ScrollViewer>
权限的集合是这个对象的列表:
class SelectedPermission{
public Guid PermissionId {get; set;}
public string Description {get; set;}
public bool IsSelected {get; set;}
}
我最初的想法是在SelectedPermission集合上实现INotifyPropertyChanged,当我绑定用户时,只需将授予所选用户的任何权限的IsSelected设置为true。但似乎应该有更好的方法。
我认为您的方法没有任何问题,您基本上是在创建一个ViewModel来封装权限。
然而,我会更进一步,定义一个Selectable ViewModel,它将是任何其他基于复选框的选择屏幕的通用解决方案:
public class Selectable<T>: ViewModelBase //ViewModelBase should Implement NotifyPropertyChanged.
{
private T _model;
public T Model
{ get { return _model; }
set
{
_model = value;
NotifyPropertyChange("Model");
}
}
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
NotifyPropertyChange("IsSelected");
}
}
}
然后你可以做:
public ObservableCollection<Selectable<Permission>> Permissions {get;set; } //etc.