另一個問題是近來一直困擾着我,而且我相當確定這是我缺乏WPF/MVVM技能,這些技巧阻止了我明顯的挑戰。我相信解決方案是一個簡單的解決方案,但是,我不確定如何實施它。在不改變模型數據的情況下在視圖模型中顯示數據不同
我正在WPF/C#中開發,我正在使用MVVM designpattern。
爲了簡單起見,我將問題歸結爲最基本的組件。
該場景:
我有一個模型,只包含一個整數。
我有一個父ViewModel,顯示這個整數。
我有兩個子視圖模型,合併在父視圖模型中,都顯示此整數。在其中一個視圖模型中,我有一個Command,將整數的值遞增爲1.該值在模型中更改,該模型實現INotifyPropertyChanged,因此使第二個ViewModel知道更改,以便相應地進行更新。
到目前爲止一切正常。
但是,我對一個新功能感興趣,我無法讓它工作。說,我在我的第二個viewmodel想要顯示整數,但我想改變數據的顯示方式。但是,應該這樣做,而不改變模型中的數據。如果模型中的數據發生變化,轉換後的數據會相應改變。
作爲一個例子,我們假設整數是5.在第二個viewmodel上,我想顯示整數+ 2,意思是7. 然後數據從第一個viewmodel改爲6,這意味着屬性第二個viewmodel自動變爲8。
這是如何實現的?
幾codepieces,來說明一下系統看起來像至今:
的型號:
public DataModel()
{
data = new Data();
data.Value = 2;
}
public Data data { get; set; }
與數據類:
public class Data : INotifyPropertyChanged
{
private int m_Value;
public int Value
{
get { return m_Value; }
set
{
if (m_Value != value)
{
m_Value = value;
OnPropertyChanged("Value");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
的mainviewmodel
public class MainViewModel : ViewModelBase
{
readonly DataModel _dataModel;
public MainViewModel()
{
_dataModel = new DataModel();
ViewModel1 = new 1ViewModel(this);
ViewModel2 = new 2ViewModel(this);
}
public 1ViewModel ViewModel1 { get; set; }
public 2ViewModel ViewModel2 { get; set; }
public Data Data
{
get { return _dataModel.data; }
}
}
這裏是ChildViewmodels結合自己的數據對象
public class 1ViewModel : ViewModelBase
{
private MainViewModel _mainViewModel;
public 1ViewModel(MainViewModel mainViewModel)
{
_mainViewModel = mainViewModel;
}
public Data Number
{
get { return _mainViewModel.data; }
}
}
而且在廠景的方式,我已經綁定的號碼屬性這樣
<TextBlock Text="{Binding Path=Number.Value}" />
同樣,我想以便能夠在視圖模型上創建第二個屬性,該視圖模型基於(但不更改原始數據)以及哪些更新與正在更新的數據一起顯示轉換後的數據。 優選地,它應該是一種將數據轉換爲新數據的轉換器方法。
希望你能幫上忙。
謝謝,我會立即調查一下。我使用更多視圖模型的原因是主視圖模型有一個tabcontrol,而evey子視圖模型是一個不同的選項卡。它們都共享相同的數據源,但它們顯示的數據不同。 – Sagi1981 2010-11-18 17:14:32