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

时间:2016-10-17 20:35:51

标签: c# wpf mvvm combobox inotifypropertychanged

我正在使用MVVM和Galasoft MVVMLight库。

我有两个型号;每个都有一个布尔属性和相同类型的不同属性。

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类型是一个枚举,其值为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让用户选择三个枚举值中的一个,并在某些情况下显示自定义文本。资源&#34; enumComboBoxTemplate&#34;允许ComboBox下拉列表显示枚举说明。转换器&#34; inheritanceEnum2Desc&#34;是应用自定义文本的位置。 &#34; object1&#34;是&#34; Model1&#34;的一个实例。

<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>

&#34;模型2&#34;将在未来使用类似功能但使用不同数据的编程中使用。

当我更改ComboBox中的选择时,我想更改&#34;更新&#34;的值。 (从false到true)所以我可以在视图中启用一个按钮。这似乎要求EnumPair类以某种方式使程序执行Model1Property的setter。由于这两个模型类具有EnumPair类型的属性,我不相信我可以在EnumPair中添加任何特定于任一模型类的代码。

我怎样才能做到这一点?我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

所以,而不是拥有&#34; Model1&#34;在你的viewmodel中,你会得到一个&#34; IModel1&#34;而是在你的viewmodel中。您可以传入现在传入的同一个对象,它是Model1类型,因为它实现了IModel1接口。当你准备好切换时,传入一个Model2,它将工作,而不必重写视图或视图模型中的任何内容。您的setter可以完全不同 - 只要两个模型都具有界面所需的所有方法和属性,您就可以了。

或者,如果Model2与Model1完全相同,只是它有&#34;额外的东西,&#34;你可以使Model2成为派生自Model1的派生类。

谷歌搜索其中任何一个术语都应该指向一个好的教程。