2010-07-05 61 views
0

我目前正在研究一個將成爲數據記錄可視化工具(用於Pascal記錄)的新項目。它應該提供一種方法來定義具有數據字段和指針字段的給定記錄,然後會有一個示例視圖,您可以在其中查看記錄「正在執行」。WPF MVVM困境:ViewModel作爲控件派生與樣式或與UserControl POCO?

現在我遇到的問題是,在這個模型中有記錄和組件,它們之間的關係是一個記錄有多個組件(如上所述的數據和指針)。

我想使用MVVM的應用程序,但我現在不確定我應該如何處理這個。我將記錄和組件模型化爲RecordViewModel和ComponentViewModel(派生了DataComponentVM,PointerComponentVM)。

我們提供了尋找這些虛擬機有2個選項,據我所知:

  • 派生從管制的ViewModels和提供的ControlTemplate
  • 創建使用視圖模型作爲DataContext的
  • 一個用戶控件

UserControl方法適用於RecordViewModel,但是當我嘗試設計ComponentViewModels的顯示方式(在ContentPresenter中)時,此方法失敗,因爲我需要提供UserControls的集合(而不是DataComponentViewModels)在我的RecordViewModel,將使這項工作(我非常確定這不是一個好主意)。

控制方法也有問題,ViewModels不再是POCO,我認爲它有一種奇怪的感覺,也不被認爲是好的做法。

有沒有其他解決問題的方法?在這方面你有什麼其他的好建議嗎?

提前致謝!

代碼:

public class RecordViewModel : BaseViewModel 
{ 
    public RecordViewModel() 
    { 
     Components = new ObservableCollection<ComponentViewModel>(); 
    } 

    public ObservableCollection<ComponentViewModel> Components { get; set; } 
} 

public class DataComponentViewModel : ComponentViewModel 
{ 
    public string Type { get; set; } 
} 

public class PointerComponentViewModel : ComponentViewModel 
{ 
    public object Target { get; set; } 
} 

回答

0

噢,上帝,爲什麼我之前沒有想到這一點?

當DataTemplates的工作方式與我想要的完全一樣時,我只是在考慮ControlTemplates(因此需要我的ViewModel派生自Control)。

0

我迷路了,爲什麼你認爲你需要提供用戶控件的集合,但它聽起來像是你真正想要的是用於RecordViewModel有一些變化:

ObservableCollection<ComponentViewModel> Components 

然後將組件綁定到某種ItemsControl的ItemsSource屬性的xaml中。 ComponentViewModel是否需要它自己的UserControl取決於你試圖用它做什麼。

如果這沒有開始點擊你,那麼你可能想要發佈一些代碼,所以我們可以把它整理出來。

+0

提供ComponentViewModel集合的問題是,當我在ItemsPresenter的ItemsSource屬性中綁定到此集合時,只有ItemsPresenter中顯示的類型(如字符串)。 我知道我可以提供一些對ItemsPresenter模板來定義兒童的顯示方式,但隨後父定義外觀,而不是東西,僅僅是組件本身(這可能只是一個文體問題)。還有其他方法可以解決這個問題嗎? – chrischu 2010-07-05 22:29:35

+0

你可以做最簡單的事情就是覆蓋toString()方法來顯示一些有意義的每個ComponentVm。所以,如果你需要看到一個DataComponentViewModel是類型屬性,例如,隨後的ToString(){返回類型; }會做到這一點。一旦你完成了這個任務,你可以根據你的需要或者樣式來使用你的綁定。 WPF框架會給你一些有價值的東西用的ToString()免費,雖然(它顯示現在視圖模型的類型,只是因爲那是什麼object.ToString()不和你沒有覆蓋它) – Berryl 2010-07-05 23:36:04

+0

呀很好的ToString是一個很酷的方式,但不提供我足夠的靈活性(比如讓我改變給定ComponentViewModel的屬性)。 – chrischu 2010-07-06 08:13:47