3

我是 WPF 和 MVVM 的新手,并且在如何设计我的应用程序方面遇到了很多困难(因此这里有很多问题)并且即将进行重构。我有一个 SQL 后端并且正在使用 LINQtoSQL,因此 LINQTOSQL 生成的类将成为我的模型。我还没有看到一个很好的综合示例,说明如何使模型类远离视图 - 在我现在查看的示例中,视图绑定到 ModelClass.Something,而不是具有引用 ModelClass.Something 的 ViewModel 属性。我认为这很糟糕(如果数据库中的该字段更改视图中断)是否正确?

我目前正在努力的是下拉列表。示例:我有一个名为 MessageType 的查找表,其中包含一个 id 和文本字段以及一个用于获取它们的存储库方法。所以在我看来,我想避免将 DisplayMemberPath 和 SelectedValue 路径绑定到模型的 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 操作。我是不是太过分了还是错过了什么?

4

3 回答 3

3

MVVM 的目标是让您的应用程序更易于维护,并让您不必花费大量时间调试紧密耦合的意大利面条式代码。如果 MVVM 模式的纯实现为您实现了这一点,那么值得您花时间充分应用它。另一方面,如果您花费大量时间为您的模型类编写 ViewModel 代理,但您的应用程序很小,并且一旦完成就不会发生太大变化,那么纯粹的 MVVM 方法可能会过大。

如果您想避免将模型完全暴露给视图,您可能必须创建模型的特定于 ViewModel 的版本并复制所有依赖项(例如 Mission -> MessageType)。

您可能会发现这篇文章很有用:http: //msdn.microsoft.com/en-us/magazine/ff798279.aspx,尤其是关于集合的部分。

于 2012-04-20T12:34:52.290 回答
1

看起来你MessageType真的是一个不可变的值类型,所以我认为视图模型是不必要的。

假设您正在使用一个绑定到类似 a 的视图,MissionViewModel并且有一个下拉列表要填充MessageType绑定到您已为其显示 getter 的属性的选项,我认为您正在做的很好。

默认情况下,使用对象填充下拉列表MessageType(通过绑定到ItemsSource)应显示调用ToString()每个项目的结果。如果这不能给你想要的结果,你可以使用视图模型或者创建一个IValueConverter实现来显示你想要的。

如果您的下拉列表中有视图模型而不是MessageType对象本身,那么您可以mission.MessageType通过SelectedItem使用IValueConverter将视图模型转换为MessageType. 要执行此转换,您可以

A. 将底层暴露MessageType为视图模型的公共属性,
B. 使视图模型本身实现IValueConverter,以便转换操作可以访问私有MessageType字段,或
C.IValueConverter再次创建视图模型的嵌套类所以它可以访问私有MessageType字段

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

于 2012-04-20T12:43:23.100 回答
0

您需要使用命令而不是直接从视图模型中访问视图,反之亦然。请参阅具有模型-视图-视图模型设计模式的 WPF 应用程序

于 2012-04-20T12:23:45.000 回答