WPF / MVVM:在ViewModel

时间:2015-10-29 04:20:48

标签: wpf mvvm inotifypropertychanged

这是关于MVVM最佳实践的问题。

假设我有一对属性F0&我的模型中的F1,F0跟随F1(基于某些逻辑):

class Model
{
    private float _f0;
    public float F0
    {
        get { return _f0; }
        private set 
        { 
           _f0 = value;
           RaisePropertyChanged("F0");  //I know this isn't allowed - bear with me...
        }
    }

    private float _f1;
    public float F1
    {
        get { return _f1; }
        set
        {
           _f1 = value;
           RaisePropertyChanged("F1");

           if(someLogic)
              F0 = F1;
        }
    }
}

如果我的ViewModel中有一个Model实例,我可以通过直接绑定到F0(OneWay)和F1(TwoWay)来实现这项工作,即:

<TextBox Text="{Binding Path=modelInstance.F0, Mode=OneWay}" IsReadOnly="True"/>
<Slider Value="{Binding Path=modelInstance.F1, Mode=TwoWay}" />

当然,那不是MVVM。更好地包装他们&amp; “展平”ModelView提供的属性:

class ViewModel
{
    public float Model_F0
    {
        get{ return modelInstance.F0; }
    }
    public float Model_F1
    {
        get{ return modelInstance.F1; }
        set
        {
           modelInstance.F1 = value;
           RaisePropertyChanged("Model_F1");
        }
    }        
}

然后绑定变为:

<TextBox Text="{Binding Path=Model_F0, Mode=OneWay}" IsReadOnly="True"/>
<Slider Value="{Binding Path=Model_F1, Mode=TwoWay}" />

这里显而易见的问题是,View不会知道何时更改F0,因为它绑定到Model_F0(而不是直接绑定到F0)。所以我的问题是:解决这个问题的正确方法是什么?在第一种情况下,我通过直接绑定到模型中的属性来“破坏”MVVM模式;在第二种情况下,行为是不正确的。

注意以上是一个高度简化的例子;实际上,“F1”可能会影响更多的属性,而不仅仅是“F0”(或根本没有)。因此,明确提高Model_F1 setter中的Model_F0并不是一个可行的解决方案;我正在寻找一种更通用的方法来处理这样的场景,其中一些Model的属性可能影响其他属性,并且这些属性需要由ViewModel包装以供View使用。

0 个答案:

没有答案