我有一个基于 MVVM 的 WPF 应用程序,它依赖于Caliburn.Micro。
在一个视图中,我正在显示 aDataGrid
和 a Button
。显示DataGrid
项目集合,其中项目类派生自PropertyChangedBase
。
该按钮应根据可编辑DataGrid
单元格中的内容启用或禁用。使用Caliburn.Micro实现这一目标的最可靠方法是什么?
从示意图上看,这就是我的代码现在的样子:
public class ItemViewModel : PropertyChangedBase { }
...
public class ItemsViewModel : PropertyChangedBase
{
private IObservableCollection<ItemViewModel> _items;
// This is the DataGrid in ItemsView
public IObservableCollection<ItemViewModel> Items
{
get { return _items; }
set
{
_items = value;
NotifyOfPropertyChange(() => Items);
}
}
// This is the button in ItemsView
public void DoWork() { }
// This is the button enable "switch" in ItemsView
public bool CanDoWork
{
get { return Items.All(item => item.NotifiableProperty == some_state); }
}
}
就代码而言,没有通知ItemsViewModel.CanDoWork
何时NotifiableProperty
更改,例如当用户编辑ItemsView
´s中的一个单元格时DataGrid
。因此,DoWork
按钮启用状态将永远不会改变。
Items
一种可能的解决方法是为集合中的每个项目添加一个(匿名)事件处理程序:
foreach (var item in Items)
item.PropertyChanged +=
(sender, args) => NotifyOfPropertyChange(() => CanDoWork);
但是我还需要跟踪何时(如果)从Items
集合中添加或删除项目,或者Items
集合是否完全重新初始化。
有没有更优雅和可靠的解决方案来解决这个问题?我确定有,但到目前为止我还没有找到它。