C# 双倍价值变化引发的火灾事件

C# 双倍价值变化引发的火灾事件,c#,wpf,events,inotifypropertychanged,C#,Wpf,Events,Inotifypropertychanged,我在自定义类中使用了INotifyPropertyChanged在变量发生更改时触发事件,但我想知道是否有一种简单的方法可以在单个变量发生更改时触发事件,例如double 例如,在WPF应用程序中,如果我有 private double a; 在main window.xaml.cs中,是否有一种简单的方法可以在a被分配时触发事件?字段没有任何跟踪更改的方法。为了让它工作,它需要是一个属性,并且需要一些东西来处理跟踪。这就是INotifyPropertyChanged接口的目的 跟踪此值更改的

我在自定义类中使用了
INotifyPropertyChanged
在变量发生更改时触发事件,但我想知道是否有一种简单的方法可以在单个变量发生更改时触发事件,例如double

例如,在WPF应用程序中,如果我有

private double a;

main window.xaml.cs
中,是否有一种简单的方法可以在
a
被分配时触发事件?

字段没有任何跟踪更改的方法。为了让它工作,它需要是一个属性,并且需要一些东西来处理跟踪。这就是INotifyPropertyChanged接口的目的


跟踪此值更改的正常方法是在类中实现
INotifyPropertyChanged

如果我理解正确,您需要为创建一个Setter,然后触发PropertyChange事件/自定义事件,而不是将
a
封装到类中

大概是这样的:

private double a;

    public double A
    {
        get { return a; }
        set { a = value;
              firepropertyChange(a);
            }
    }
是(视情况而定),如果通过属性包装变量访问并在更改时触发事件,并确保所有对该变量的访问都是通过属性进行的,如

private double a;

public double PropertyA
{
    get
    {
        return a;
    }
    set
    {
        // set value and fire event only when value is changed
        // if we want to know when value set is the same then remove if condition
        if (a != value)
        {
            a = value;
            PropertyChanged("PropertyA");
        }
    }
}

// when changing a, make sure to use the property instead...
PropertyA = 5.2;
…否则,没有

如果您使用的是C#5.0,则可以通过以下方式使用
CallerMemberName
属性:

class MyData : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            RaisePropertyChanged();
        }
    }

    private string _anotherProperty;
    public string AnotherProperty
    {
        get { return _anotherProperty; }
        set
        {
            _anotherProperty = value;
            RaisePropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged([CallerMemberName] string caller = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(caller));
        }
    }
}
如您所见,您只需调用
RaisePropertyChanged()中为每个属性设置
,无需反复键入属性名称

另一种方法是定义
ModelBase
类:

class ModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void Set<T>(ref T field, T value, [CallerMemberName] string propertyName = "")
    {
        if (!Object.Equals(field, value))
        {
            field = value;

            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

提供一个字符串参数是一种糟糕的风格和非泛型。您应该提供
A
itself@StefanoL你是部分正确的,尽管在这种情况下还不错。请看,这也是一个硬编码值,用户输入会出现问题
class Conf : ModelBase
{
    NodeType _nodeType = NodeType.Type1;

    public NodeType NodeType
    {
        get { return _nodeType; }
        set { Set(ref _nodeType, value); }
    }
}