2012-04-20 109 views
3

我是WPF和MVVM的新手,我正在为如何设计我的应用程序而苦苦挣扎(因此这里有很多问题),并且正在进行重构。我有一个SQL后端,并使用LINQtoSQL,因此LINQTOSQL生成的类将成为我的模型。我还没有看到如何让模型类远离视图的一个很好的综合示例 - 在我现在看到的示例中,视图绑定到ModelClass.Something,而不是具有引用ModelClass.Something的ViewModel属性。我是否认为这是错误的(如果该字段在数据库中发生变化,视图就会中断)?MVVM设计模式问题

我现在正在努力的是下拉列表。例如:我有一个名为MessageType的查找表,带有一个id和文本字段以及一个存储库方法来获取它们。所以在我看来,我想避免将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一个任务对象现在有这个新班?我真的很努力地获得与任务对象,其子女及其父母的模式,我找不到任何人们正在使用MVVM进行CRUD操作的全面示例。我是通过顶部还是失去了一些东西?

+0

除非您的视图模型实际上为类添加了行为(例如'INotifyPropertyChanged'实现或特定于视图的命令/属性),那么我不会将它包装在视图模型中 - 它只会导致不必要的维护 – 2012-04-20 12:44:45

回答

3

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

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

您可能会觉得这篇文章有用:http://msdn.microsoft.com/en-us/magazine/ff798279.aspx,特别是有关收藏的章节。

+0

感谢链接,它看起来很有用,尽管我还没有完全理解它。我认为我要实事求是,并且忘记为我的下拉数据编写代理类,因为看起来有点过头了,为每个类添加额外的类,因为它们不太可能发生变化。 – Nix 2012-04-20 14:34:08

1

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

假设你用绑定的东西像MissionViewModel并没有你想绑定到你已经证明,吸附剂中的财产MessageType选项来填充下拉列表视图中工作,我觉得你在做什么很好。

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

如果你有看法的模型在下拉列表,而不是MessageType对象本身,那么你可以通过使用IValueConverter到视图模型转换为MessageType结合mission.MessageTypeSelectedItem。要执行此转换,可以

A.暴露出下面MessageType作为视图模型的公共属性,
B.使视图模型本身实现IValueConverter所以转换操作可以访问私有MessageType场,或
C.创建IValueConverter作为一个嵌套类的视图模式,再这样它可以访问私有MessageType

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