我正在使用带有Galasoft MVVMLight库的MVVM。
我有两个模型;每个都有一个布尔属性和相同类型的不同属性。
public class Model1 : ObservableObject
{
public EnumPair<YesNoInherit> Model1Property
{
get { return _model1Property; }
set
{
_model1Property = value;
Updated = true
RaisePropertyChanged("Model1Property");
}
}
public bool Updated
{
get { return _updated; }
set
{
_updated = value;
RaisePropertyChanged("Updated");
}
}
}
public class Model2 : ObservableObject
{
public EnumPair<YesNoInherit> Model2Property
{
get { return _model2Property; }
set
{
_model2Property = value;
Updated = true
RaisePropertyChanged("Model2Property");
}
}
public bool Updated
{
get { return _updated; }
set
{
_updated = value;
RaisePropertyChanged("Updated");
}
}
}
YesNoInherit类型为enum,取值为No、Yes和Inherit。
这是EnumPair类。
public class EnumPair<T> : ObservableObject where T : struct, IConvertible
{
public T EnumValue
{
get { return _enumValue; }
set
{
if (Type.Equals(value, _enumValue) == false)
{
_enumValue = value;
RaisePropertyChanged();
}
}
}
public string SourceName
{
get { return _sourceName; }
set
{
_sourceName = value;
RaisePropertyChanged();
}
}
}
在我看来,我正在尝试使用ComboBox来让用户选择三个枚举值中的一个,并且在某些情况下显示自定义文本。资源"enumComboBoxTemplate"允许ComboBox下拉显示枚举描述。转换器"inheritanceEnum2Desc"是应用自定义文本的地方。"object1"是"Model1"的一个实例。
<ComboBox ItemTemplate=ItemTemplate="{StaticResource enumComboBoxTemplate}"
EnumSource="enums:YesNoInherit">
<ComboBox.Text>
<MultiBinding Converter="{StaticResource inheritanceEnum2Desc}">
<Binding Path="object1.EnumValue"/>
<Binding Path="object1.SourceName"/>
</MultiBinding>
</ComboBox.Text>
</ComboBox>
"Model2"将在未来的编程中使用类似的功能,但使用不同的数据。
当我改变ComboBox中的选择时,我想改变"Updated"的值(从false变为true),这样我就可以在视图中启用一个按钮。这似乎要求EnumPair类以某种方式使程序执行Model1Property的setter。因为这两个模型类都有EnumPair类型的属性,我不相信我可以在EnumPair中添加任何特定于任何一个模型类的代码。
我怎样才能做到这一点?我将非常感谢您的帮助。
基本上,您有两种选择:要么使用某种消息总线来更新另一个模型(Prism有EventAggregator
,不确定MVVMLight),要么使两个模型实例将它们的属性转发到一个公共数据源,当属性更改时通知所有用户。
如果您希望将来能够轻松地从一个类更改为另一个类,而无需重写所有代码,则需要创建一个接口,该接口定义了两个模型共有的所有内容,并且两个模型类都需要实现该接口。您可以调用接口IModel1
所以,在你的视图模型中不是有一个"Model1",而是有一个"IModel1"。您可以传入与现在传入的对象相同的对象,该对象的类型为Model1,因为它实现了IModel1接口。当您准备切换时,传入一个Model2代替,它将工作,而不必重写视图或视图模型中的任何内容。你的setter可以完全不同——只要两个模型都有接口所需的所有方法和属性,你就可以了。
或者,如果Model2完全像Model1,除了它有"额外的东西",您可以使Model2成为一个派生自Model1的派生类。
在谷歌上搜索这两个词中的任何一个,你都可以找到一个好的教程。