我刚刚开始使用MVVM模式,并决定将MVVM Light工具包用于Windows Phone应用程序。

我的问题是这样的:

我在生成 View 模型时遇到麻烦,该 View 模型可以将 View 正确绑定(bind)到具有不仅仅是原始类型的属性的模型—这是构造模型和随附 View 模型的一种有效方法,以便 View 可以绑定(bind)到模型通过 View 模型,并在模型中的值更改时正确更新?

与之类似,如何正确地从 View 模型中引用模型的值?

这种类型的模型的一个示例是 Foo 类,它具有一个属性b,它是一个基元;另一个属性a,类型是 Bar ,具有自己的属性-基元或否则。

Foo:

public class Foo : ObservableObject
{

    public Foo()
    {

        a = new Bar();
    }

    public const string aPropertyName = "a";
    private Bar _a;
    public Bar a
    {
        get
        {
            return _a;
        }
        set
        {
            Set(aPropertyName, ref _a, value);
        }
    }

    public const string bPropertyName = "b";
    private bool _b;
    public bool b
    {
        get
        {
            return _b;
        }
        set
        {
            Set(bPropertyName, ref _b, value);
        }
    }
}

酒吧:
public class Bar : ObservableObject
{

    public const string cPropertyName = "c";
    private bool _c;
    public bool c
    {
        get
        {
            return _c;
        }
        set
        {
            Set(cPropertyName, ref _c, value);
        }
    }
}

编辑:澄清一下,在 View 模型中设置属性时,我应该做些什么:
    public const string cPropertyName = "c";
    public bool c
    {
        get
        {
            return model.a.c;
        }
        set
        {

            model.a.c = value;
            RaisePropertyChanged(cPropertyName);
        }
    }

还是不同的?

最佳答案

我认为您要提出的问题是嵌套与平面 View 模型。根据情况,这两种方法都是正确的方法(尽管我更喜欢嵌套 View 模型)。
我不建议您使用什么,但是以Foo-Bar为例,用Foo中的属性包装Bar的属性会更有意义[Flat View模型方法]。因此,您通过创建属性c所做的事情是正确的。

以下是我对两种方法的看法

嵌套 View 模型的优点

  • 这就是面向对象的全部内容。
  • 如果使用LINQ to SQL或Entities或ORM,则可以简单地传递ORM对象,而不必传递所有类型的属性。
  • 您可以传递其他 View ,因此可以为部分 View 创建单独的模型,并且如果该 View 使用部分 View ,则可以将部分 View 模型类作为 View 模型类的属性传递。

  • 平面 View 模型的优势
  • 使事情简单易读。
  • 关于c# - 使用MVVM模式(尤其是使用MVVM Light)时,如何实现不仅仅是原始图元的模型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28913055/

    10-17 02:11