使更新一个类中的属性触发另一个类中该类型属性的setter

本文关键字:属性 另一个 类型 setter 更新 一个 | 更新日期: 2023-09-27 18:13:22

我正在使用带有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中添加任何特定于任何一个模型类的代码。

我怎样才能做到这一点?我将非常感谢您的帮助。

使更新一个类中的属性触发另一个类中该类型属性的setter

基本上,您有两种选择:要么使用某种消息总线来更新另一个模型(Prism有EventAggregator,不确定MVVMLight),要么使两个模型实例将它们的属性转发到一个公共数据源,当属性更改时通知所有用户。

如果您希望将来能够轻松地从一个类更改为另一个类,而无需重写所有代码,则需要创建一个接口,该接口定义了两个模型共有的所有内容,并且两个模型类都需要实现该接口。您可以调用接口IModel1

所以,在你的视图模型中不是有一个"Model1",而是有一个"IModel1"。您可以传入与现在传入的对象相同的对象,该对象的类型为Model1,因为它实现了IModel1接口。当您准备切换时,传入一个Model2代替,它将工作,而不必重写视图或视图模型中的任何内容。你的setter可以完全不同——只要两个模型都有接口所需的所有方法和属性,你就可以了。

或者,如果Model2完全像Model1,除了它有"额外的东西",您可以使Model2成为一个派生自Model1的派生类。

在谷歌上搜索这两个词中的任何一个,你都可以找到一个好的教程。