我是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操作的综合例子。我是否会超过顶部或遗漏某些东西?
答案 0 :(得分:3)
MVVM的目标是使您的应用程序更易于维护,并且不必花费大量时间来调试紧密耦合的意大利面条代码。如果MVVM模式的纯实现为您实现了这一点,那么完全应用它是值得的。另一方面,如果您花费大量时间为模型类编写ViewModel代理,但是您的应用程序很小并且一旦完成就不会更改,MVVM的纯粹方法可能会过度。
如果您想避免将模型完全暴露给视图,您可能需要创建模型的ViewModel特定版本并复制所有依赖项(例如Mission - &gt; MessageType)重新开始。
您可能会发现本文很有用:http://msdn.microsoft.com/en-us/magazine/ff798279.aspx,尤其是有关集合的部分。
答案 1 :(得分:1)
看起来你的MessageType
实际上是一个不可变的值类型,所以我不认为视图模型是必要的。
假设您正在使用绑定到MissionViewModel
之类的视图并且有一个下拉列表,您希望填充绑定到您已显示getter的属性的MessageType
个选项,我认为你做的很好。
使用MessageType
对象填充下拉列表(通过绑定到ItemsSource
)默认情况下应显示在每个项目上调用ToString()
的结果。如果这不能提供您想要的结果,您可以使用视图模型或创建IValueConverter
实现来显示您想要的结果。
如果您的下拉列表中包含视图模型而不是MessageType
个对象本身,那么您可以使用mission.MessageType
转换SelectedItem
到IValueConverter
视图模型为MessageType
。要执行此转换,您可以
一个。将基础MessageType
公开为视图模型的公共属性,
B.使视图模型本身实现IValueConverter
,以便转换操作可以访问私有MessageType
字段,或者
C.创建IValueConverter
作为视图模型的嵌套类,再次使其可以访问私有MessageType
字段
选项B的一个缺点是你需要一个公共无参数构造函数来将转换器添加到XAML ResourceDictionary
中。
答案 2 :(得分:0)
您需要使用命令而不是直接从viewmodel访问视图,反之亦然。请参阅WPF Apps With The Model-View-ViewModel Design Pattern