我目前正在研究一個將成爲數據記錄可視化工具(用於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; }
}
提供ComponentViewModel集合的問題是,當我在ItemsPresenter的ItemsSource屬性中綁定到此集合時,只有ItemsPresenter中顯示的類型(如字符串)。 我知道我可以提供一些對ItemsPresenter模板來定義兒童的顯示方式,但隨後父定義外觀,而不是東西,僅僅是組件本身(這可能只是一個文體問題)。還有其他方法可以解決這個問題嗎? – chrischu 2010-07-05 22:29:35
你可以做最簡單的事情就是覆蓋toString()方法來顯示一些有意義的每個ComponentVm。所以,如果你需要看到一個DataComponentViewModel是類型屬性,例如,隨後的ToString(){返回類型; }會做到這一點。一旦你完成了這個任務,你可以根據你的需要或者樣式來使用你的綁定。 WPF框架會給你一些有價值的東西用的ToString()免費,雖然(它顯示現在視圖模型的類型,只是因爲那是什麼object.ToString()不和你沒有覆蓋它) – Berryl 2010-07-05 23:36:04
呀很好的ToString是一個很酷的方式,但不提供我足夠的靈活性(比如讓我改變給定ComponentViewModel的屬性)。 – chrischu 2010-07-06 08:13:47