这是关于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使用。