[英]MVVM design pattern problems
我是WPF和MVVM的新手,并且在如何设计我的应用程序方面遇到了很多困难(因此在这里有很多问题)并且即将进行重构。 我有一个SQL后端并使用LINQtoSQL,因此LINQTOSQL生成的类将是我的模型。 我还没有看到如何使模型类远离视图的一个很好的综合示例 - 在我现在看的示例中,视图绑定到ModelClass.Something而不是具有引用ModelClass.Something的ViewModel属性。 我是否认为这是坏的(如果该字段在数据库中发生了变化,那么View会中断)?
我现在正在努力的是下拉列表。 示例:我有一个名为MessageType的查找表,其中包含id和text字段以及用于获取它们的存储库方法。 所以在我看来,我想避免将DisplayMemberPath和SelectedValue路径绑定到Model的MessageType类上的字段,那么我是否需要创建一个新类并在ViewModel中公开该类的属性? 像这样:
public class MessageTypeViewModel : ViewModelBase
{
public MessageTypeViewModel(MessageType t)
{
MessageTypeText = t.messageTypeText;
MessageTypeId = t.messageTypeId;
}
public string MessageTypeText { get; private set; }//bind DisplayMember and SelectedValue to these properties
public int MessageTypeId { get; private set; }
}
像这样填充:
get
{
if (textMessageSelectionOptions == null)
{
var list = repository.GetMessageTypes().Select(x=>new MessageTypeViewModel(x)).ToList();
textMessageSelectionOptions =new ReadOnlyCollection<MessageTypeViewModel>(list);
}
return textMessageSelectionOptions;
}
另外我有一个Mission对象,它具有MessageType的外键,那么如果我现在拥有这个新类,如何将组合框的SelectedItem绑定到mission.MessageType? 我真的很难获得任务对象,它的孩子和它的父母的模式,我找不到任何人们用MVVM进行CRUD操作的综合例子。 我是否会超越顶部或遗漏某些东西?
MVVM的目标是使您的应用程序更易于维护,并使您不必花费大量时间来调试紧密耦合的意大利面条代码。 如果MVVM模式的纯实现为您实现了这一点,那么完全应用它是值得的。 另一方面,如果您花费大量时间为模型类编写ViewModel代理,但是您的应用程序很小并且一旦完成就不会更改太多,MVVM的纯粹方法可能会过度。
如果您想避免将模型完全暴露给视图,您可能必须创建模型的ViewModel特定版本,并在您使用时复制所有依赖项(例如Mission - > MessageType)。
您可能会发现本文很有用: http : //msdn.microsoft.com/en-us/magazine/ff798279.aspx ,尤其是有关集合的部分。
看起来你的MessageType
实际上是一个不可变的值类型,所以我不认为视图模型是必要的。
假设您正在使用绑定到MissionViewModel
类的MissionViewModel
并且有一个下拉列表,您希望使用绑定到您已显示getter的属性的MessageType
选项填充,我认为您正在做的事情很好。
使用MessageType
对象ItemsSource
下拉列表(通过绑定到ItemsSource
)应该默认显示在每个项目上调用ToString()
的结果。 如果这不能提供您想要的结果,您可以使用视图模型,也可以创建一个IValueConverter
实现来显示您想要的结果。
如果你有看法的模型在下拉列表,而不是MessageType
对象本身,那么你就可以绑定mission.MessageType
到SelectedItem
通过使用IValueConverter
到视图模型转换MessageType
。 要执行此转换,您可以
A.将底层MessageType
公开为视图模型的公共属性,
B.使视图模型本身实现IValueConverter
以便转换操作可以访问私有MessageType
字段,或
C.创建IValueConverter
作为视图模型的嵌套类,再次使其可以访问私有MessageType
字段
选项B的一个缺点是你需要一个公共无参数构造函数来在XAML ResourceDictionary
添加转换器。
您需要使用命令而不是从视图模型直接访问视图,反之亦然。 请参阅使用Model-View-ViewModel设计模式的WPF应用程序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.