2013-02-20 48 views
0

我目前正在重构一些使用C#编写在WPF之上的旧代码。WPF数据绑定复杂对象模型

我现在有一个看起来像这样的复合用户模型:

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

在这个模型中,权限列表授予由模型所引用的用户权限ID的列表。

在我的用户管理界面的xaml中,我列出了绑定到组合框的这些模型,当选择更改时,所选项绑定到包含用户属性和项目控件的文本框的网格。

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

的项目控件的代码看起来是这样的:

<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;} 
} 

我最初的想法是要落实在INotifyPropertyChanged的SelectedPermission集合,当我绑定我的用户时,只需将IsSelected设置为true,以获取授予选定用户的任何权限。但似乎应该有更好的方法。

回答

1

我没有看到你的方法有什么问题,你基本上是创建一个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. 
+0

我会给出一个答案,我只是想,有可能比迭代DataContext更容易将IsSelected绑定到用户权限列表。 – Philter 2013-02-20 14:40:55

+0

你可以使用LinQ。 – 2013-02-20 14:43:02

+0

是的,但我认为可能有一种方法可以在Xaml中实现。 – Philter 2013-02-20 14:48:47