静态 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
}
我有这个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
}