项目属性更改时更新ListView

时间:2010-09-29 09:29:54

标签: wpf listview mvvm


我想实现一个面板来设置用户权限。所以我有一个PermissionListView,其中ItemSource是一个ObservableCollection,在这个PermissionListView中,每个Item都有一个Checkbox,它绑定到PermissionViewModel.Checked。我调试了它,这很有效。

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

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

  1. 是否还有更多的MVVM来完成'检查同样在UserListView.SelectedItem.Permissions中的所有PermissionViewModel'?

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

2 个答案:

答案 0 :(得分: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中。如果他们不在用户身上,那么就从他们所在的地方获取。

请随意询问我尚未理解的任何内容;如果没有照片,很难弄清楚你正在做什么!

答案 1 :(得分:0)

作为另一个答案,您应该实现INotifyPropertyChanged - 我还会引入一个CollectionView并设置IsSynchronizedWithCurrentItem = true并更改处理选择,而不是从视图中分离。

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