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

时间:2013-02-20 00:36:11

标签: c# wpf data-binding

我目前正致力于使用C#重构一些用WPF编写的旧代码。

我目前有一个复合用户模型,如下所示:

public class UserModel{
   public User User {get; set;}
   public List<Guid> Permissions {get; set;}
}

在此模型中,权限列表是授予模型引用的用户的权限ID列表。

在我的用户管理屏幕的xaml中,我有一个绑定到组合框的这些模型的列表,当选择更改时,所选项目绑定到包含User属性和Items Control的文本框的Grid。

此项控件在页面加载时填充了绑定到系统中所有权限的复选框。我的问题是将权限列表绑定到项目控件中的复选框的最佳方法是什么?

项目控件的代码如下所示:

<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即可授予所选用户的任何权限。但似乎应该有更好的方法。

1 个答案:

答案 0 :(得分:1)

我认为你的方法没有任何问题,你基本上是在创建一个ViewModel来包装权限。

但是,我会更进一步,定义一个可选的ViewModel,它可以是您可能拥有的任何其他基于CheckBox的选择屏幕的通用解决方案:

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.