为什么我不能在静态属性中使用 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();
因为编译器会自动inject属性名。
我只选择了Expression<Func<T>>,因为这个电话(几乎)与对 caliburn micro 的NotifyPropertyChange 的电话完全相同。
您需要知道的是,由于NotifyPropertyChange 方法是静态方法而不是实例方法,您不能将其重构为基类(例如MyViewModelBase)就像您可以使用实例方法一样 - 这也是 caliburn micro 所做的。
因此,您需要在每个具有静态属性的 ViewModel 中复制并粘贴事件和 NotifyPropertyChange<T> 方法,或者创建一个封装功能的静态助手。