2010-11-18 79 views
0

另一個問題是近來一直困擾着我,而且我相當確定這是我缺乏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}" /> 

同樣,我想以便能夠在視圖模型上創建第二個屬性,該視圖模型基於(但不更改原始數據)以及哪些更新與正在更新的數據一起顯示轉換後的數據。 優選地,它應該是一種將數據轉換爲新數據的轉換器方法。

希望你能幫上忙。

回答

1

ViewModel應該將數據準備好顯示,但不知道它將顯示的方式。如果您想要更改數據在視圖中的顯示方式,那麼您可以使用Converter。這將允許您爲多個視圖使用相同的ViewModel並具有不同的外觀。

另外,在ViewModel中包裝ViewModel並不一定是您想要的方式。 ViewModel通常具有關聯的視圖。如果您對ViewModel沒有視圖,請將數據視爲典型類並繼續使用您的單個ViewModel。

+0

謝謝,我會立即調查一下。我使用更多視圖模型的原因是主視圖模型有一個tabcontrol,而evey子視圖模型是一個不同的選項卡。它們都共享相同的數據源,但它們顯示的數據不同。 – Sagi1981 2010-11-18 17:14:32

0

使用的的IValueConverter:

public class AddConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (int)value + (int)parameter; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return (int)value - (int)parameter;    
    } 
} 

而在你的XAML,添加資源:

和更新的結合:

我這裏使用的ConverterParameter,但你可以如果需要,硬編碼值。可能還想爲轉換器添加一些檢查,因爲如果類型不正確,它將引發異常。

相關問題