首页 文章

ViewModel中的MVVM属性?

提问于
浏览
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 + "€";
}

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

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

2 回答

  • 0

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

    • 尝试在UI,逻辑组和重复部分中找到边界 .

    • 将它们排除在外

    • 您可以随时重置DataContext,或使用更复杂的绑定路径,如 MyVm.SubVm.Property

  • 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指定模型的属性,就像我在解决方案中提到的那样 . 我想有点不成熟,但你给了它一个想法 .

相关问题