2013-05-27 83 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是在这种情况下去的方式,而不是依赖属性。 –