我刚刚开始使用 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/