0

我有一个绑定到 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 + "€";
}

这只是一个片段。我通常在 VIEWMODEL 中有大约 50 个属性,所有方法也在 ViewModel 中(意味着 RelayCommands 和方法,将在大约 50% 的属性的设置器中调用)。如您所见,我没有使用任何模型。这是使用 MVVM 的正常方式还是应该创建一个新类并将所有属性/方法放在新类(模型)中?...但是我应该如何将视图中的元素与属性中的属性绑定模型,当视图 DataContext 绑定到 ViewModel 时?

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

4

2 回答 2

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 中存在的 Model 的属性直接从 View 访问 Model 的属性。

这可能有点难以掌握,但这确实是让视图与模型通信的方式。另一方面,您可以像我在解决方案中提到的那样指定模型的属性,同时使用 INotifyPropertyChanged。我猜有点不成熟,但你给了考虑一下。

于 2013-05-27T15:26:35.110 回答
0

“分而治之”应该可以帮助您提高可维护性

  • 尝试在您的 UI、逻辑组、重复部分中找到边界。
  • 把它们排除在外
  • 您始终可以重置 DataContext,或者使用更复杂的绑定路径,例如MyVm.SubVm.Property
于 2013-05-27T14:30:51.393 回答