Xamarin + Prism:来自层次模型/视图模型的泡沫属性更改事件或......?

时间:2016-09-01 11:55:50

标签: mvvm xamarin prism viewmodel inotifypropertychanged

我一直试图找到解决这个问题的正确方法,使用Prism和Xamarin Forms:

我有一个模型类Customer,它包含另一个类,Address作为属性。在我看来,我显示了两个对象的字段。我想要一个“保存”按钮,只有在对这些模型进行一些更改后才能启用。

现在,按钮被绑定到一个Command,带有相应的CanSave()函数,与DelegateCommands一样正常。我试图找到一种方法,我可以在我的视图模型上最终得到一个IsDirty属性,在更改为基础模型后变为“true”。

MVVM方法

我认为首先是“纯粹主义”的mvvm方法。一个“平面”视图模型,具有每个可视元素的属性,实现为Prism BindableObject,其中每个getter / setter从/向底层模型类获取/设置值。

虽然失败了,因为SetProperty<>有一个ref参数,我不能使用我的模型中的属性。

过度设计的方法[?]

我想到的第二件事是,如果我的内在模型本身是可观察的,我可以在整个树中听取所有这些模型的变化。这开辟了一个全新的问题世界。我在View模型中注册属性更改侦听器吗?我是否可以制作内部模型的可观察性,并让父母听取他们孩子的变化事件并传播它?

那些可观察模型的方法难道不会很快变成事件处理程序吗?

最简单的事情

最后,最简单的事情是可能的。我有一个平面可观察的ViewModel,它只在读取和读取时读取/写入实际内层次模型的值。保存

你们觉得怎么样?

2 个答案:

答案 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的帮助