我有一个看起来像这样的ViewModel类。
class MyViewModel : Screen
{
public BindableCollection<MyObject> MyObjects { get; set; }
private MyObject selectedObject;
public MyObject SelectedMyObject
{
get { return selectedObject; }
set
{
selectedObject = value:
//some additional unrelated logic
}
}
public void SaveObject()
{
//some logic
}
public bool CanSaveObject{
get{
//logic to determine if the selectedObject is valid
}
}
这是相关的代码。现在问题。
MyObject
是一个包含三个属性的类。在视图中,我有一个绑定到MyObjects
集合的ListView,以及绑定到SelectedItem
中ListView
的三个TextBox。
当我填写文本框时,相关对象在模型中被更改,但我想确保对象处于有效状态,然后才能保存它。 CanSaveObject
具有必要的逻辑,但问题是永远不会被调用,因为当文本框被填充时我没有任何机会调用NotifyOfPropertyChanged,因为只调用了selectedObject
的属性,并且没有MyViewModel
上的属性。
所以问题是:如果没有在ViewModel上创建封装MyObject
内的属性的属性,有没有什么好方法可以做到这一点。
如果我创建这样的属性,然后在视图中直接绑定到这些而不是SelectedItem
,我已经得到了它,但是如果像这样的黑客是唯一的方法,那么viewmodel会匆忙搞得一团糟去做吧。我希望不是:)
public string SelectedObjectPropertyOne{
get{ return selectedObject.PropertyOne; }
set{
selectedObject.PropertyOne = value;
NotifyOfPropertyChange(() => SelectedObjectPropertyOne);
NotifyOfPropertyChange(() => CanSaveObject);
}
}
答案 0 :(得分:2)
ActionMessage.EnforceGuardsDuringInvocation
是一个静态布尔字段,可以设置为在即将调用操作时强制执行保护检查。这将保护实际的Save操作不被调用,但是在更新所选模型之后立即基于保护状态的UI外观问题将无法解决。
如果不这样做,我可以建议的唯一其他修改是为MyObject模型创建VM类型并移动验证并在那里保存逻辑。这也可以让你简化你的观点......