- 为什么我不能在静态属性中使用 NotifyOfPropertyChange?
-
Caliburn micro 中是否有另一个 NotifyOfPropertyChange 函数可以在静态属性中使用,或者以另一种方式使用它以及如何使用它?
private static string _data = ""; public static string _Data { get { return _data; } set { _data = value; NotifyOfPropertyChange(() => _Data); } }
您可以创建自己的方法来引发StaticPropertyChanged
事件:
private static string _data = "";
public static string _Data
{
get
{
return _data;
}
set
{
_data = value;
NotifyStaticPropertyChanged(nameof(_Data));
}
}
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
private static void NotifyStaticPropertyChanged(string propertyName)
{
if (StaticPropertyChanged != null)
StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName));
}
有关详细信息,请参阅以下博客文章:http://10rem.net/blog/2011/11/29/wpf-45-binding-and-change-notification-for-static-properties
为什么我不能在静态属性中使用 NotifyOfPropertyChange?
好吧,你不能像现在这样使用它,因为它NotifyOfPropertyChange
是一个实例方法,而不是一个静态方法。
Caliburn micro 中是否有另一个 NotifyOfPropertyChange 函数 [...]?
不,据我所知,事实并非如此。但是,您可以推出自己的实现,例如
public static event PropertyChangedEventHandler PropertyChanged;
private static void NotifyPropertyChange<T>(Expression<Func<T>> property)
{
string propertyName = (((MemberExpression) property.Body).Member as PropertyInfo).Name;
PropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}
然后可以这样称呼
NotifyOfPropertyChange(() => _Data);
在您的财产设置器中。
关于签名的编辑:
而不是
private static void NotifyPropertyChange<T>(Expression<Func<T>> property) { ... }
你也可以使用
private static void NotifyPropertyChange([CallerMemberName] string property) { ... }
它的优点是你不必显式传递任何东西,你可以像这样调用它
NotifyPropertyChange();
因为编译器会自动注入属性名称。
我只是去了Expression<Func<T>>
,因为电话(几乎)与对Caliburn Micro的NotifyPropertyChange
的电话完全相同。
您需要知道的是,由于NotifyPropertyChange
方法是静态方法而不是实例方法,因此您无法将其重构为基类(例如MyViewModelBase
) 就像您可以使用实例方法所做的那样 - 这也是 Caliburn Micro 所做的。
因此,您需要将事件和NotifyPropertyChange<T>
方法复制并粘贴到每个具有静态属性的 ViewModel 中,或者创建一个静态帮助程序来包装功能。