使用WPF数据绑定复杂对象模型 [英] Databinding Complex Object Models with WPF

查看:301
本文介绍了使用WPF数据绑定复杂对象模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在重构一些用C#编写的WPF之前的旧代码。



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

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

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



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



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



项目控件的代码看起来像这样: p>

 < ScrollViewer Grid.Row =7Grid.Column =1> 
< ItemsControl ItemsSource = {Binding}>
< ItemsControl.ItemsTemplate>
< DataTemplate>
<复选框Content ={Binding Description}IsChecked ={Binding IsSelected}/>
< / DataTemplate>
< /ItemsControl.ItemsTemplate>
< / ScrollViewer>

权限集合是此对象的列表:

  class SelectedPermission {
public Guid PermissionId {get; set;}
public string说明{get; set;}
public bool IsSelected {get; set;}
}

我最初的想法是在SelectedPermission集合上实现INotifyPropertyChanged对于授予所选用户的任何权限,我绑定我的用户只是将IsSelected设置为true。但是似乎应该有一个更好的方法。

解决方案

我没有看到你的方法有问题,你是基本上创建一个ViewModel来包装权限。



然而,我将进一步说明一个可选的ViewModel,这将是任何其他CheckBox-您可能拥有的基于选择的屏幕:

  public class可选< T>:ViewModelBase // ViewModelBase应实现NotifyPropertyChanged。 
{
private T _model;
public T模型
{get {return _model; }
set
{
_model = value;
NotifyPropertyChange(Model);
}
}

private bool _isSelected;
public bool IsSelected
{
get {return _isSelected; }
set
{
_isSelected = value;
NotifyPropertyChange(IsSelected);
}
}

}

然后你可以做:

  public ObservableCollection<可选< Permission>>权限{get; set } //等。 


I'm currently working on refactoring some old code that was written on top of WPF with C#.

I currently have a composite user model that looks like this:

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

In this model the Permissions list is a list of the permission IDs granted to the User referenced by the model.

In my xaml for my user management screen I have a list of these models bound to a combo box and when the selection changes the selected item is bound to a Grid containing text boxes for the User property and an Items Control.

This items control is filled with check boxes bound to all of the permissions in the systems when the page loads. My question is what is the best way to bind the Permissions list to the check boxes in the items control?

The code for the items control looks something like this:

<ScrollViewer Grid.Row="7" Grid.Column="1">
  <ItemsControl ItemsSource={Binding}>
    <ItemsControl.ItemsTemplate>
        <DataTemplate>
            <Checkbox Content="{Binding Description}" IsChecked="{Binding IsSelected}"/>
        </DataTemplate>
    </ItemsControl.ItemsTemplate>
</ScrollViewer>

And the collection of permissions is a List of this object:

class SelectedPermission{
   public Guid PermissionId {get; set;}
   public string Description {get; set;}
   public bool IsSelected {get; set;}
 }

My initial thought was to implement INotifyPropertyChanged on the SelectedPermission collection and when I bind my user just set IsSelected to true for any permissions that are granted to the selected user. But it seems like there should be a better way.

解决方案

I don't see anything wrong with your approach, you're basically creating a ViewModel to wrap the permissions into.

However, I would go a step further and define a Selectable ViewModel, which would be a generic solution for whatever other CheckBox-based selection screens you might have:

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

 }

Then you can do:

public ObservableCollection<Selectable<Permission>> Permissions {get;set; } //etc.

这篇关于使用WPF数据绑定复杂对象模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆