繁体   English   中英

MVVM设计模式问题

[英]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.MessageTypeSelectedItem通过使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM