2012-04-20 152 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中。