Wpf 如何在列表的任何项出现时更新视图模型属性<&燃气轮机;更新了吗?

Wpf 如何在列表的任何项出现时更新视图模型属性<&燃气轮机;更新了吗?,wpf,binding,viewmodel,Wpf,Binding,Viewmodel,我有一个领域模型毒蛇。BindableObject实现所有INotifyPropertyChanged接口。 简化模型: public class Viper : BindableObject { public int CaseId { get; set; } public string SerialNumber { get; set; } private byte _status; public Byte Status { get {

我有一个领域模型毒蛇。BindableObject实现所有INotifyPropertyChanged接口。 简化模型:

public class Viper : BindableObject
{
    public int CaseId { get; set; }
    public string SerialNumber { get; set; }

    private byte _status;
    public Byte Status
    {
        get { return _status; }
        set { SetField(ref _status, value, "Status"); }
    }

    private List<CasePersonnel> _personnel;
    public List<CasePersonnel> Personnel
    {
        get { return _personnel; }
        set { SetField(ref _personnel, value, "Personnel"); }
    }

    private List<CaseFluids> _caseFluidList;
    public List<CaseFluids> CaseFluidsList
    {
        get { return _caseFluidList; }
        set { SetField(ref _caseFluidList, value, "CaseFluidsList"); }
    }

    public List<Gauge> Gauges { get; set; }
}
我创建了一个参照Viper域模型的viewmodel,并添加了InAlarm属性:

public class ViperViewModel : BindableObject
{

    #region Constructors
    public ViperViewModel(Viper viper)
    {
        InstanceViper = viper;
    }
    #endregion

    public Viper InstanceViper { get; set; }

    private bool _inAlarm;
    public virtual bool InAlarm
    {
        get { return _inAlarm; }
        set { SetField(ref _inAlarm, value, "InAlarm"); }
    }
}

我有一个要绑定到ViperViewModel的InAlarm属性(闪烁红色)的usercontrol边框。但是,如果InstanceViper.Gauge的任何ShowAlarm属性为true,我需要ViperViewModel.InAlarm属性为true。当应用程序从外部源接收数据时,该仪表属性将更新。当基础域模型的gauge.ShowAlarm属性之一设置为true时,如何/应该更新viewmodel的InAlarm属性?

gauge
中创建
事件处理程序
事件,当
ShowAlarm
更改时,您会引发该事件

使用
public bool?
属性创建一个
AlarmedEventArgs


订阅
ViperViewModel
中的事件,触发时方法应设置
InAlarm

我需要单独订阅每个仪表对象的事件处理程序,还是可以一次订阅整个列表?创建所有仪表后,您可以运行foreach来附加方法处理程序。创建一个新事件只是为了ShowAlarm还是注册PropertyChanged事件更好,因为它已经被触发了?我明白了,所以
设置字段会引发它?如果是这样,那么这将是可行的,并且可能是建议的。使用
PropertyChanged
。是的,我遗漏了那部分。受保护的bool SetField(ref T field,T value,string propertyName){if(EqualityComparer.Default.Equals(field,value))返回false;field=value;OnPropertyChanged(propertyName);返回true;}每种类型您需要多少个?
public class ViperViewModel : BindableObject
{

    #region Constructors
    public ViperViewModel(Viper viper)
    {
        InstanceViper = viper;
    }
    #endregion

    public Viper InstanceViper { get; set; }

    private bool _inAlarm;
    public virtual bool InAlarm
    {
        get { return _inAlarm; }
        set { SetField(ref _inAlarm, value, "InAlarm"); }
    }
}