我的问题是“什么是最佳做法?”类型,在一个非常具体的案例中:
我有一个包含复选框列表框的视图。
listbox.ItemsSource 绑定到 ViewModel (人员列表)中的集合。每个 checkbox.IsChecked 都绑定到 Person.IsSelected 。
选中/取消选中复选框会激活ViewModel中的'Refresh'方法,该方法可能会也可能不会重新设置所有人的Person.IsChecked。当然,这应该通知用户界面Person.IsChecked(可能有)已经改变。
我的问题是:谁应该负责调用 ViewMode.Refresh ? UI应该通过事件或命令调用方法吗?或者 ViewModel 是否应在人中订阅适当的事件。
答案 0 :(得分:3)
如果UI绑定到IsChecked
,则无需通知任何内容。或者,相反,WPF本身会通知它。这是MVVM的吸引力之一。视图模型可以根据自己的规则集简单地更新其状态,视图会通过绑定自动接收这些更改。
答案 1 :(得分:1)
取决于“呼叫”的含义
这是答案
如果你的意思是创建:
如果你在谈论执行方法:
在你的情况下也很重要:
你说你的清单与收藏有限
在这里你可能会遇到麻烦,因为你的View更改了Person.IsSelected
,它应该为你的IsSelected引发一个PropertyChanged。
现在它会卡住,因为如果您的商品属性更改是一个已知问题,则ObservableCollection
不会收到通知。要解决此问题,您需要将INotifyPropertyChanged
事件与CollectionChanged
中的ObservableCollection
事件相关联。因此它可以冒泡到您的VM,它可以执行他的Refresh()
Here你可以看到一个如何做到这一点的例子。
答案 2 :(得分:1)
我想你必须问自己,回应的“刷新”是什么?
如果它是对物理点击的复选框的响应,则视图有责任调用它。
如果它是对所选人的回应,则视图模型应该正在观察其自己的集合以更改IsSelected。
我同意MehaJain后者更难设置,但是替代方案破坏了层之间单个工作单元的责任,这意味着逻辑需要在任何其他功能中重复导致IsSelected被更改。这包括绑定到相同信息的其他视图,其他命令(例如,您有一个用于运行选择特定人员的过滤器的按钮)和测试。
答案 3 :(得分:0)
我更喜欢通过事件或命令刷新视图模型。
因为订阅集合成员很棘手。 假设您要使用第二种方法:订阅Person类更改事件。 然后它可能有以下缺点:
所以,如果你去订阅Person类的更改事件,这是一个头脑。