2012-08-03 85 views
1

我正在尋找一點點指導,我正在放在一起的WPF/MVVM應用程序。谷歌今天沒有幫助我。使用ViewModel公開嵌套模型

所以我有一個應用程序與一些模型(域對象)有其他模型作爲屬性。現在,我只是展開嵌套的對象,並在包含對象的ViewModel中公開屬性。

隨着我的模型變得越來越複雜,我一直在努力解決ViewModels的問題。我正朝着「合成視圖」前進,其中「包含」對象具有ViewModel,而「嵌套」對象也具有其自己的視圖模型。這也會給我一些可重用的代碼,這將是一個加號。

作爲一個超級簡單的例子,假設我有一個建築,每個建築都有一些屬性,並與像這樣的地址一起:

public class Building 
{ 
    public string Name { get; set;} 
    public Address Address { get; set;} 
} 

public class Address 
{ 
    public string Number { get; set; } 
    public string Street { get; set; } 
} 

然後,我有一個視圖模型的建設,對於地址的視圖模型(由BuildingViewModel曝光):

public class BuildingViewModel 
{ 
    public string Name { get; set; } // from model 
    public AddressViewModel Address { get; set; } // a wrapped instance of Address 
    // INPC, etc... 
} 

public class AddressViewModel 
{ 
    public string Number { get; set; } // originally from Building 
    public string Street { get; set; } 
    // INPC, etc... 
} 

因此,和未示出,我有一個BuildingView和一個嵌套AddressView。我只是簡單地使用ViewModel與數據模板。

現在,我該如何保持Address對象的同步?只要我將它們分成兩個ViewModel,我就會得到Address對象的兩個實例。在我所做的所有搜索中,我已經看到來回使用消息傳遞對象,並且提到了「Observer」模式。

我是否朝着正確的方向前進,還是錯過了一些非常簡單的事情?任何建議表示讚賞。

FWIW,我已經拼湊出自己的框架,因爲我一直對學習曲線感到厭倦。另外,迄今爲止它非常簡單。

回答

1

我認爲你目前的方向暴露了太多的信息,並且阻止了模型和視圖模型鬆散耦合。

我將只有一個封裝所有數據(建築物和地址)的模型實例。任何viewmodel都可以通過靜態方法獲得這個實例。

然後,我會暴露在查詢您的數據庫的模型中的查詢方法,例如返回一個結果列表,然後可以填充您的視圖。

請注意,列表不一定是建築物或地址列表,每個列表項都應包含對視圖模型最有用的內容,例如builidng中的某些字段以及嵌套地址記錄中的其他字段。

順便說一句,Wpf有一個很棒的機制,可以直接將視圖模型數據與視圖鏈接起來,例如查詢結果帶有列表框,而視圖模型不需要知道視圖的任何內容。

+0

那麼這將如何工作?我的意思是,地址字段與我的數據上下文(SQL)中的Building實例一起出現。 – 2012-08-03 15:32:08

+0

修正的回答。 – Surfbutler 2012-08-04 07:09:01

1

您可以將您的地址在AddressViewModel使用地址類型的後端存儲領域:

public class AddressViewModel 
    { 
     private readonly Address _address; 

     public AddressViewModel(Address address) 
     { 
      _address = address; 
     } 

     public string Number 
     { 
      get { return _address.Number; } 
      set { _adress.Number = value; } 
     } 
     public string Street 
     { 
      get { return _address.Street; } 
      set { _adress.Street = value; } 
     } 
    } 

我希望你可以做我的代碼:-)

編輯:

接下來試試:)

我認爲解決問題的最好方法是使用一些工廠類/方法你從哪裏得到你的模型。例如,您有一個帶有方法GetAddressList()的AddessList類。該方法返回您的Address模型對象的列表。在第一次調用之後,將返回的對象緩存在AddressList類中,以及下一次調用返回緩存列表。

public static class AddressList 
    { 
     private static List<Address> _backend; 

     private static AddressList() 
     { 
      _backend = new List<Address>(); 
     } 

     public static List<Address> GetAddressList() 
     { 
      if(_backend.Count == 0) 
      { 
       //Here you can load your models from your data source 
      } 
      else 
      { 
       return _backend; 
      } 
     } 
    } 
+0

謝謝,安德烈,但我確實有屬性的支持領域。我省略了它們以減少代碼量... – 2012-08-03 15:30:19

+0

我在我的帖子上做了一些編輯。 – Andre 2012-08-03 17:44:22