使用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。但似乎应该有更好的方法。

使用WPF对复杂对象模型进行数据绑定

我认为您的方法没有任何问题,您基本上是在创建一个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.