ViewModel中的MVVM属性?

时间:2013-05-27 14:04:52

标签: c# xaml mvvm binding

我有一个绑定到ViewModel的视图

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

文本框,...绑定到ViewModel中的属性:

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

ViewModel中的属性:

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 + "€";
}

这只是一个剪辑。我通常在THE VIEWMODEL中有~50个属性,所有方法也在ViewModel中(意味着RelayCommands AND方法,它们将在约50%属性的setter中调用)。 如您所见,我没有使用任何模型。这是使用MVVM的正常方式还是我应该创建一个新类并将所有属性/方法放在新类(Model)中?...但是我应该如何将视图中的元素与属性中的元素绑定在一起?模型,当视图DataContext绑定到ViewModel?

编辑:说清楚。 我有一个TextBox,TextBox绑定到ViewModel中的属性。这是使用MVVM的正确方法吗?我应该只在我有一个List(例如ComboBox)时使用Model-Class,或者当我有几个TextBox时(我的眼中有点愚蠢和不必要),我应该使用Model-Class吗?

2 个答案:

答案 0 :(得分:1)

我希望我明白你要做什么。我的解决方案包含我在MVVM模式中使用的DependencyProperty,而不是INotifyPropertyChanged。

可以说,你有一个包含属性的模型:

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

然后相应的ViewModel将是这样的。声明属性和依赖属性:

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
        )
    );

并在ViewModel中创建Model类(SymStatsModel)的属性:

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

这样,您分配给ViewModel符号属性的值将分配给模型属性。此外,您可以通过访问ViewModel中存在的模型的属性,从View直接访问Model的属性。

这可能有点难以理解,但这确实是使视图与模型通信的方法。另一方面,您可以使用INotifyPropertyChanged指定模型的属性,就像我在解决方案中提到的那样。我想有点不成熟,但是你给了它一个想法。

答案 1 :(得分:0)

&#34;分而治之&#34;应该帮助你保持可维护性

  • 尝试在UI,逻辑组和重复部分中找到边界。
  • 将它们排除在外
  • 您可以随时重置DataContext,或使用更复杂的绑定路径,例如MyVm.SubVm.Property