MVVM设计模式问题

时间:2012-04-20 12:09:42

标签: c# wpf

我是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操作的综合例子。我是否会超过顶部或遗漏某些东西?

3 个答案:

答案 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转换SelectedItemIValueConverter视图模型为MessageType。要执行此转换,您可以

一个。将基础MessageType公开为视图模型的公共属性,
 B.使视图模型本身实现IValueConverter,以便转换操作可以访问私有MessageType字段,或者  C.创建IValueConverter作为视图模型的嵌套类,再次使其可以访问私有MessageType字段

选项B的一个缺点是你需要一个公共无参数构造函数来将转换器添加到XAML ResourceDictionary中。

答案 2 :(得分:0)

您需要使用命令而不是直接从viewmodel访问视图,反之亦然。请参阅WPF Apps With The Model-View-ViewModel Design Pattern