我一直试图找到解决这个问题的正确方法,使用Prism和Xamarin Forms:
我有一个模型类Customer,它包含另一个类,Address作为属性。在我看来,我显示了两个对象的字段。我想要一个“保存”按钮,只有在对这些模型进行一些更改后才能启用。
现在,按钮被绑定到一个Command,带有相应的CanSave()函数,与DelegateCommands一样正常。我试图找到一种方法,我可以在我的视图模型上最终得到一个IsDirty属性,在更改为基础模型后变为“true”。
MVVM方法
我认为首先是“纯粹主义”的mvvm方法。一个“平面”视图模型,具有每个可视元素的属性,实现为Prism BindableObject,其中每个getter / setter从/向底层模型类获取/设置值。
虽然失败了,因为SetProperty<>有一个ref参数,我不能使用我的模型中的属性。
过度设计的方法[?]
我想到的第二件事是,如果我的内在模型本身是可观察的,我可以在整个树中听取所有这些模型的变化。这开辟了一个全新的问题世界。我在View模型中注册属性更改侦听器吗?我是否可以制作内部模型的可观察性,并让父母听取他们孩子的变化事件并传播它?
那些可观察模型的方法难道不会很快变成事件处理程序吗?
最简单的事情
最后,最简单的事情是可能的。我有一个平面可观察的ViewModel,它只在读取和读取时读取/写入实际内层次模型的值。保存
你们觉得怎么样?
答案 0 :(得分:0)
也许我没有理解你的问题,但我想知道你为什么要限制自己像python setup.py install --force
这样的小辅助函数。它有4 Lines of code。它所做的就是检查相等性,设定值并举办活动。
您可以轻松创建另一个这样的辅助函数。
<强> MyBindableBase 强>
SetProperty
<强>模型强>
protected virtual bool SetProperty<T>(Func<T> get, Action<T> set, T value, [CallerMemberName] string propertyName = null)
{
if (object.Equals(get(), value)) return false;
set(value);
OnPropertyChanged(propertyName);
return true;
}
<强>视图模型强>
class Model
{
public string Property { get; set; }
}
如果您为映射和/或使用反射引入一些命名规则,我认为您可以缩短用法。
答案 1 :(得分:0)
好吧,最后我选择了第3选项,这是我能做的最简单的事情。
我倾向于从我的模型中返回属性,这很容易,并且使用可以为空的[?。]语法,它也是无效的,但我发现有时我必须包装实际的模型具有更友好的UI的属性,暴露比我的实际DB模型类更多/不同的属性。
所以,我去了,直到其他一些复杂性迫使我再次改变主意:)
非常感谢@ Sven-MichaelStübe和@adminSoftDK的帮助