我在 静态* 类中找到了一个针对 静态 属性的通知属性更改示例。但它不会更新TextBlock中的任何更改。这是代码。 *
第一次绑定正在使用构造函数中的“测试”字符串,但StaticPropertyChanged始终为null。
public static class InteractionData { public static List<string> SelectedDirectories { get; set; } private static string errorMessage { get; set; } public static string ErrorMessgae { get { return errorMessage; } set { errorMessage = value; NotifyStaticPropertyChanged("errorMessage"); } } static InteractionData() { SelectedDirectories = new List<string>(); errorMessage = "test"; } public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; private static void NotifyStaticPropertyChanged(string propertyName) { if (StaticPropertyChanged != null) StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName)); } }
在视野中…
xmlns:error ="clr-namespace:CopyBackup.Providers" <TextBlock Text="{Binding Source={x:Static error:InteractionData.ErrorMessgae} ,Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
无论我在哪里更改属性,TextBlock都不会更新。
欣赏
与INotifyPropertyChanged的实现类似,静态属性更改通知仅在触发StaticPropertyChanged事件时使用正确的属性名称时才起作用。
StaticPropertyChanged
使用属性名称,而不是后备字段的名称:
public static string ErrorMessgae { get { return errorMessage; } set { errorMessage = value; NotifyStaticPropertyChanged("ErrorMessgae"); // not "errorMessage" } }
当然,您还应该修复拼写错误的属性名称:
public static string ErrorMessage { get { return errorMessage; } set { errorMessage = value; NotifyStaticPropertyChanged("ErrorMessage"); } }
绑定应如下所示:
Text="{Binding Path=(error:InteractionData.ErrorMessage)}"
有关静态属性更改通知的详细信息,请参见此博客文章。
您也可以避免使用以下代码来编写属性名称CallerMemberNameAttribute:
CallerMemberNameAttribute
using System.Runtime.CompilerServices; ... public static event PropertyChangedEventHandler StaticPropertyChanged; private static void NotifyStaticPropertyChanged( [CallerMemberName] string propertyName = null) { StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName)); }
现在,您可以在不显式指定属性名称的情况下调用该方法:
NotifyStaticPropertyChanged();