通知静态类中的静态属性绑定

我在静态类中找到了静态属性的notify属性更改示例。 但它不会更新TextBlock中的任何更改。 这是代码。

第一个绑定在构造函数中使用“test”字符串,但StaticPropertyChanged始终为null。

public static class InteractionData { public static List 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(); errorMessage = "test"; } public static event EventHandler StaticPropertyChanged; private static void NotifyStaticPropertyChanged(string propertyName) { if (StaticPropertyChanged != null) StaticPropertyChanged(null, new PropertyChangedEventArgs(propertyName)); } } 

在视图中……

  xmlns:error ="clr-namespace:CopyBackup.Providers"  

无论我在何处更改属性,TextBlock都不会更新。

欣赏

与INotifyPropertyChanged的实现类似,只有在触发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来避免编写属性名称:

 using System.Runtime.CompilerServices; ... public static event PropertyChangedEventHandler StaticPropertyChanged; private static void NotifyStaticPropertyChanged( [CallerMemberName] string propertyName = null) { StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName)); } 

您现在可以在不显式指定属性名称的情况下调用该方法:

 NotifyStaticPropertyChanged();