我遇到这种情况,我有几个相互关联的控件。我对所述控件的Current / SelectedValue使用双向绑定,这样当用户更改值时,更改将反映在我的viewmodel的属性中。问题是,在绑定触发更改属性的setter处的更改后,我需要更改其他控件,基于第一个,更新UI,然后仅使用所有受影响属性的新值发送一个事件。我想在这方面做一些事情(类似于IEditableObject的东西):
public string PropA
{
get{(...)}
set
{
BeginEdit("PropA");
PropA = value;
PropB = SomeValueDependentOnA;
PropC = SomeValueDependentOnA;
OnPropertyChanged("PropA");
EndEdit("PropA"); //this is propA so send the event
}
public string PropB
{
get{(...)}
set
{
BeginEdit("PropB");
PropB = value;
PropA = SomeValueDependentOnB;
PropC = SomeValueDependentOnB;
OnPropertyChanged("PropB");
EndEdit("PropB");
}
(...)
begin / endit方法不会做太多,只需检查启动操作的prop是否与调用endit相同,因此将忽略进一步的beginedits。 EndEdit我们将确保只有在PropA的setter中我们才能确定所有属性都已更改,我们可以发送事件,即事务类型。
虽然我认为这会起作用,但我认为这对于setter来说太过分了,而start / endit对于这个简单的事情来说似乎有些过分。
使用双向绑定可能不是这种情况的最佳选择,我应该从代码中的方法而不是属性设置器进行更新。
关于如何以其他方式这样做的任何消息?
答案 0 :(得分:1)
恕我直言,大多数'犹太教'的方法是使用DependecyProperties
在其强制处理程序中包含冲突代码,就像UI组件一样。
另一种方法是在VM字段上应用逻辑,而不是属性,然后触发UpdateTarget()
绑定。
答案 1 :(得分:0)
我见过的标准方法是:
set
{
if (PropA != value)
{
PropA = value;
OnPropertyChanged("PropA");
}
}
这样,您只会在值更改时触发敲击更改,后续调用(由相关值触发)不会触发更多更改。