【问题标题】:Update ListView when properties of items change项目属性更改时更新 ListView
【发布时间】:2010-09-29 20:34:29
【问题描述】:


我想实现一个面板来设置用户权限。所以我有一个 PermissionListView,其中 ItemSource 是一个 ObservableCollection,在这个 PermissionListView 中,我为每个绑定到 PermissionViewModel.Checked 的项目都有一个复选框。我对其进行了调试,并且可以正常工作。

用户在另一个 ListView(UserListView) 中被选中。但是我没有看到比简单地使用 OnSelectionChanged 事件遍历 ObservableCollection 并设置 PermissionViewModel.Checked = true 或 false 来检查包含在 UserListView.SelectedItem.Permissions 中的权限的更类似于 MVVM 的方法。

但由于属性的更改不会触发 CollectionChanged 事件,因此面板仍会显示最后一个用户的选择。

  1. 是否还有类似 MVVM 的方法来完成“检查所有也在 UserListView.SelectedItem.Permissions 中的 PermissionViewModels”?

  2. 如果没有,如何在设置列表项的 Checked 属性后在 Listview 中进行可见更新?

【问题讨论】:

    标签: wpf listview mvvm


    【解决方案1】:

    我可以使用具有实际用户和权限的示例,因此我将继续创建一个 - 如果这与您尝试做的不匹配,请告诉我。

    您拥有这样的用户和权限(我使用 * 表示选中,是或 - 表示选中):

    UserListView        PermissionsListView
    
    *Fred*              Read Yes
    Wilma               Write -
    Barney              Execute -
    Betty
    

    所以 PermissionsListView 当前显示 Fred 的权限。看来您想知道如何更改权限列表以在选择 Barney 时显示 Barney 的权限。

    您可以做的是将 OnSelectionChanged 绑定到模型,以便它更新选定的用户,然后通过另一个属性提供权限。

    MyPermissionsListModel : INotifyPropertyChanged
    {
       Command OnSelectionChanged(User user) { 
           // Command which calls ChangeSelectedUser
       }
    
       private void ChangeSelectedUser(User user) {
           _user = user;
           PropertyChanged(this, new PropertyChangedEventArgs("Permissions");
       }
    
       public ObservableCollection<Permission> Permissions {
           return new ObservableCollection<Permission>(_user.Permissions);
       }
    }
    

    然后您使用数据模板或网格视图来显示选中或未选中的权限。我认为它们是否被选中或未选中是这里权限的一部分,否则将权限和选中/未选中状态包装在他们自己的一个小 ViewModel 中。如果他们不在用户身上,那么从他们来自的任何地方获取他们。

    如有不明白的地方,请随时提出;没有图片就很难准确判断你在做什么!

    【讨论】:

      【解决方案2】:

      作为另一个答案,您应该实现 INotifyPropertyChanged - 我还将引入 CollectionView 并设置 IsSynchronizedWithCurrentItem=true 并在其上更改处理选择,而不是与视图分开。

      您还可以查看 http://mvvmfoundation.codeplex.com/ 和 PropertyObserver 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多