c# - 使用 MVVM 模式(特别是使用 MVVM Light),如何实现不仅仅是基元的模型?

标签 c# wpf mvvm windows-phone-8.1 mvvm-light

我刚刚开始使用 MVVM 模式,并已决定在我的 Windows Phone 应用程序中使用 MVVM Light 工具包。

我的问题是这样的:

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

例如,如何从 View 模型中正确引用模型的值?


此类模型的一个示例是 Foo 类,它具有一个属性 b(原语)和另一个属性 a ,即 Bar 类型,具有自己的属性——基元或其他属性。

福:

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 的属性将更有意义[平面 View 模型方法]。所以你通过创建属性 c 所做的事情是正确的。

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

嵌套 View 模型的优点

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

平面 View 模型的优点

  • 让事情变得简单且更具可读性。

关于c# - 使用 MVVM 模式(特别是使用 MVVM Light),如何实现不仅仅是基元的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28913055/

相关文章:

c# - 如何使用 DataTemplates 通过 ViewModel-First 方法缓存动态切换的 View

c# - 是否可以在HTTP get请求的头部分传递参数?

c# - 将套接字句柄从 .NET 传递到非托 pipe 进程

wpf - WPF DataGrid 的 GroupStyle 上的 HeaderTemplate 和 ContainerStyle 有什么区别?

c# - MVVM 和 INotifyPropertyChanged 问题

c# - 如何将 UserControl 中的 DependencyProperty 绑定(bind)到 DataContext 属性? Windows 应用商店

c# - 如何在 Prism 的 "OnNavigatingTo"中为任何和所有类执行操作

C# - 为什么直方图在 Excel 2016 中不起作用?

c# - 从按钮取消异步任务

wpf - 使用 Vlc.DotNet 将 VLC 播放器集成到 C# (WPF) 项目中