我想实现一个面板来设置用户权限。所以我有一个PermissionListView,其中ItemSource是一个ObservableCollection,在这个PermissionListView中,每个Item都有一个Checkbox,它绑定到PermissionViewModel.Checked。我调试了它,这很有效。
用户在另一个ListView(UserListView)中被选中。但我没有看到更像MVVM的方法来检查UserListView.SelectedItem.Permissions中包含的权限,而不是简单地使用OnSelectionChanged事件迭代ObservableCollection并设置PermissionViewModel.Checked = true或false。
但由于更改属性不会触发CollectionChanged事件,因此面板仍会显示最后一个用户的选择。
是否还有更多的MVVM来完成'检查同样在UserListView.SelectedItem.Permissions中的所有PermissionViewModel'?
如果没有,在设置列表项目的Checked属性后,如何在Listview中引起可见更新?
答案 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类。