静态 INotifyPropertyChanged 事件不起作用

Static INotifyPropertyChanged event not working

我有这个Base class:

public abstract class WiresharkFile : BaseObservableObject, IDisposable
{
    private string _fileName;
    private int _packets;
    private int _packetsSent;

    public string FileName
    {
        get { return _fileName; }
        set { _fileName = value; }
    }

    public int Packets
    {
        get { return _packets; }
        set { _packets = value; }
    }

    public int PacketsSent
    {
        get { return _packetsSent; }
        set
        {
            _packetsSent = value;
            OnPropertyChanged();
        }
    }

    public void Dispose()
    {
        // Implemented insde inherit classes.
    }
}

BaseObservableObject:

public class BaseObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    protected virtual void OnPropertyChanged<T>(Expression<Func<T>> raiser)
    {
        var propName = ((MemberExpression)raiser.Body).Member.Name;
        OnPropertyChanged(propName);
    }

    protected bool Set<T>(ref T field, T value, [CallerMemberName] string name = null)
    {
        if (!EqualityComparer<T>.Default.Equals(field, value))
        {
            field = value;
            OnPropertyChanged(name);
            return true;
        }
        return false;
    }
}

我的collection:

public ObservableCollection<WiresharkFile> wiresharkFiles { get; set; }

所以你可以看到我的 Base class 的 avery 继承 class 有这个 PacketsSent 属性 改变所以在这种情况下一切正常。

现在我在 WiresharkFile(基础 class)中有另一个静态 属性:

private static volatile int _totalPacketsSent;

public static int TotalPacketsSent
{
    get { return _totalPacketsSent; }
    set
    {
        _totalPacketsSent = value;
        OnStaticPropertyChanged();
    }
}

所以在 BaseObservableObject 我创建了这个成员:

public static event PropertyChangedEventHandler StaticPropertyChanged;

并且:

protected static void OnStaticPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = StaticPropertyChanged;
    if (handler != null) handler(typeof(WiresharkFile), new PropertyChangedEventArgs(propertyName));
}

XAML 里面我想更新我的 Label:

Content="{Binding Path=(my:WiresharkFile.TotalPacketsSent)}" 

所以这不起作用,所以目前这个 Label 是通过隐藏代码更新的。 因为我做错了什么?

由于您创建的 PropertyChangedEventHandler 不是真正的 INotifyPropertyChanged 接口的一部分,因此绑定无法识别已引发的通知事件,因此它不会从 TotalPacketsSent 中提取任何新值。要使绑定刷新本身尝试这样的事情: 放入您的 WiresharkFile class:

    private static WiresharkFile This;

    public WiresharkFile()
    {
        This = this;
    }
    private static volatile int _totalPacketsSent;

    public static int TotalPacketsSent
    {
        get { return _totalPacketsSent; }
        set
        {
            _totalPacketsSent = value;
            OnStaticPropertyChanged(This);
        }
    }

- 处理程序代码:

protected static void OnStaticPropertyChanged(object sender, [CallerMemberName]string propertyName = null)
    {
        var baseObservable = sender as BaseObservableObject;
        if(baseObservable == null) return;
        baseObservable.OnPropertyChanged(propertyName);
    }

在我看来,您不需要 BaseObservableObject 中的 PropertyChangedEventHandler 事件 class。

问候,

静态 属性 更改事件必须在 class WiresharkFile 中声明(即 class 也声明了静态 属性)。如果它在基础 class.

中声明,它将不起作用
public class WiresharkFile : BaseObservableObject
{
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    private static void OnStaticPropertyChanged(string propertyName)
    {
        var handler = StaticPropertyChanged;
        if (handler != null)
        {
            handler(null, new PropertyChangedEventArgs(propertyName));
        }
    }

    // static property here
}