且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-10-02 09:20:10

我看不出你的方法有什么问题,你基本上是在创建一个 ViewModel 来包装权限.

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

public class Selectable: ViewModelBase//ViewModelBase 应该实现 NotifyPropertyChanged.{私人 T _model;公共T型{ 得到 { 返回 _model;}放{_model = 值;NotifyPropertyChange("模型");}}私人布尔_isSelected;public bool IsSelected{得到 { 返回 _isSelected;}放{_isSelected = 值;NotifyPropertyChange("IsSelected");}}}

然后你可以这样做:

public ObservableCollection>权限{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.