2013-05-27 81 views
0

我有綁定到一個ViewModelViewModel中的MVVM屬性?

DataContext="{Binding MyViewModel, Source={StaticResource Locator}}"> 

文本框,...被綁定到propertys IN的視圖模型視圖:

<TextBox Text="{Binding MyValue, Mode=TwoWay}"/> 
<TextBlock Text="{Binding DisplayValue}"/> 

屬性,視圖模型:

public MyViewModel() 
{ 
    DisplayValue = "0€"; 
    MyValue = "0"; 
} 

private string _myvalue; 
public string MyValue 
{ 
    get 
    { 
     return _myvalue; 
    } 
    set 
    { 
     _myvalue = value; 
     ChangeValue(); 
     RaisePropertyChanged(() => MyValue); 
    } 
} 

private string _displayvalue; 
public string DisplayValue 
{ 
    get 
    { 
     return _displayvalue; 
    } 
    set 
    { 
     _displayvalue = value; 
     RaisePropertyChanged(() => DisplayValue); 
    } 
} 

private void ChangeValue() 
{ 
//do something here and change the values of the property, e.g.: 
DisplayValue = MyValue + "€"; 
} 

這只是一個剪輯。我通常在VIEWMODEL裏有50個屬性,所有的方法也都在ViewModel中(意思是RelayCommands和方法,這些方法將在約50%屬性的setter中被調用)。如您所見,我沒有使用任何模型。這是使用MVVM的正常方式,還是應該創建一個新類並將所有屬性/方法放入新類(Model)中?但是,我該如何將視圖中的元素與Model,當視圖DataContext綁定到ViewModel時?

編輯:說清楚。 我有一個文本框,文本框綁定到ViewModel中的一個屬性。這是使用MVVM的正確方法嗎?我是否應該僅在有List(例如ComboBox)時使用模型類,或者當我有幾個TextBox(這會在我的眼睛中有點愚蠢和不必要)?

+0

好吧,這可能是一個愚蠢的評論,但你有沒有測試過這段代碼? 從我可以讀,當你設置myvalue的,你提高PropertyChanged事件,然後調用給ChangeValue()方法,該方法將設置myvalue的屬性,這將提高PropertyChanged事件,這將調用ChangeValue()方法,將設置MyValue屬性...等等。 除非MyValue + =「€」不使用Setter,但我嚴重懷疑這一點。 似乎是一個很好的舊的無限循環/記憶leack。但同樣,我沒有測試它自己,所以我可能是錯的;) – Miiite

+0

是的,你是對的...愚蠢的例子,要去改變(編輯) – Rudi

回答

0

「分而治之」應該可以幫助您在維護

  • 試圖找到在你的UI邊界,邏輯組,重複的部分。
  • 因子出來
  • 您可以隨時重置的DataContext,或使用更復雜的綁定路徑像MyVm.SubVm.Property
1

我希望我明白你正在嘗試做的。我的解決方案包含我在MVVM模式中使用的DependencyProperty,而不是INotifyPropertyChanged。

比方說,你有一個模型,它包含一個屬性:

public class SymbolStatsModel 
{ 
    public string Symbol 
    { 
     get 
     { 
      return this._symbol; 
     } 
     set 
     { 
      this._symbol = value; 
     } 
    } 
} 

然後相應的視圖模型將是這樣的。聲明屬性和依賴屬性:

public string Symbol 
{ 
    get 
    { 
     return (string)GetValue(SymbolProperty); 
    } 
    set 
    { 
     SetValue(SymbolProperty, value); 
    } 
} 

public static readonly DependencyProperty SymbolProperty = 
    DependencyProperty.Register 
    (
     "Symbol", 
     typeof(string), 
     typeof(SymbolStatsViewModel), 
     new FrameworkPropertyMetadata 
     (
      string.Empty 
     ) 
    ); 

而且還創建視圖模型Model類(SymStatsModel)的屬性:

public SymbolStatsModel SymbolStatsModel 
{ 
    get 
    { 
     return new SymbolStatsModel(Symbol); 
    } 
    set 
    { 
     this.Symbol = value.Symbol; 
    } 
} 

這樣一來,您分配給視圖模型值符號屬性將被分配給模型屬性。此外,您可以通過訪問ViewModel中存在的Model屬性,直接從View中訪問Model的屬性。

這可能有點難以理解,但這確實是使視圖與模型進行通信的方式。在另一個想法中,您可以像我在解決方案中提到的那樣指定模型的屬性,同時使用INotifyPropertyChanged。我猜想有點不成熟,但你給了它一個想法。

+0

謝謝您的回答。我會試着看看會發生什麼,但這不是我正在尋找的答案。我想知道我是否正確使用MVVM。我見過一些MVVM示例,其中用戶將DataContext綁定到ViewModel,但也可以將視圖中的元素與Model中的元素綁定(我不知道他們是怎麼做的......)。所以我真正想知道的是,如果將視圖綁定到ViewModel並在ViewModel中創建所有propertys,或者我需要創建一個模型,那麼它是「好的」? (僅供參考,我使用〜95%的文本框或文本框和5%的組合框) – Rudi

+1

請不要在不需要時使用依賴項屬性。 NotifyPropertyChanged是在這種情況下去的方式,而不是依賴屬性。 –