Xamarin + Prism:从分层模型/视图模型或..



我一直在试图找到这个问题的正确方法,我得到了,使用Prism Xamarin Forms:

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

现在,按钮与相应的CanSave()函数绑定到Command上,就像通常的delegatcommands一样。我正试图找到一种方法,在我的视图模型上使用单个IsDirty属性,在对底层模型进行任何更改后,该属性会变为"true"。

MVVM方法

我首先想到的是"纯粹的"mvvm方法。"平面"视图模型,每个可视元素都有属性,作为Prism BindableObject实现,其中每个getter/setter从底层模型类获取/设置值。

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

过度设计的方法[?])

我想的第二件事是,如果我的内部模型本身是可观察的,我可以在整个树中监听所有它们的变化。这开启了一个全新的问题世界。我是否在视图模型中注册属性更改监听器?我是否应该让内在模型成为可观察的,让父母倾听孩子身上的变化事件并传播它?

这种可观察模型的方法不会很快变成事件处理程序的地狱吗?

最简单的

最后,最简单的事情。我有一个平面的可观察ViewModel,它只读取/写入值到/从实际的内部分层模型读取&保存

你们觉得怎么样?

也许我没有理解你的问题,但我想知道为什么你限制自己这样一个小的辅助函数,如SetProperty。它有4行代码。它所做的就是检查是否相等,设置值并引发事件。

您可以像这样轻松地创建另一个辅助函数。

MyBindableBase

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; }
}

ViewModel

class ViewModel : BindableBase
{
    private Model Model { get; set; }
    public string Property
    {
        get { return Model.Property; }
        set { SetProperty(() => Model.Property, x => Model.Property = x, value); }
    }
}

我认为你可以缩短用法,如果你为映射引入一些命名规则和/或使用反射。

最后我选择了选项3,这是我能做的最简单的事情。

我倾向于从我的模型返回属性,这将是容易的,并使用可空的[?语法,它也将是空安全的,但我发现,有时我将不得不包装实际的模型属性与一些更ui友好的东西,暴露更多/不同的属性比我实际的DB模型类。

所以,我就这么做了,直到一些其他的复杂性迫使我再次改变主意:)

非常感谢@Sven-Michael st和@adminSoftDK的帮助

相关内容

  • 没有找到相关文章

最新更新