WPF的MVVM框架Stylet开发文档 9. 属性变化推送基类PropertyChangedBase

9. 属性变化推送基类PropertyChangedBase

原文地址

PropertyChangedBase 是实现 INotifyPropertyChanged 的​​类型的基类,并提供了引发 PropertyChanged 通知的方法。

发起通知

有多种方法可以引发 PropertyChanged 通知,具体取决于您想要做什么。

最常见的情况是每次分配属性时都会引发通知。PropertyChangedBase 提供了一个很好的实用方法来提供帮助:SetAndNotify。通过引用,它需要一个字段和一个要分配给该字段的值。如果字段的值 != 值,则分配发生,并引发 PropertyChanged 通知。例如:

class MyClass : PropertyChangedBase
{
   private string _name;
   public string Name
   {
      get { return this._name; }
      set { SetAndNotify(ref this._name, value); }
   }

要连接到您必须放入视图中的对象:

<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>

如果您想为当前属性以外的属性引发 PropertyChanged 通知,也有几种方法可以实现(取决于您使用的是 C#6 还是更低版本)。首选的 C# 6 方式是使用nameof(),因为它非常便宜并且提供编译时安全性。如果您使用的是 C# 5 或更低版本,则可以使用表达式:这更慢,但也提供了编译时安全性。如果你真的想要,你也可以使用原始字符串。见下文:

class MyClass : PropertyChangedBase
{
   private string _firstName;
   public string FirstName
   {
      get { return _firstName; }
      private set
      {
         SetAndNotify(ref _firstName, value);
         
        //如果您使用的是 C# 6,则首选,因为它提供了编译时安全
         this.NotifyOfPropertyChange(nameof(this.FullName));         
      }
   }
   private string _lastName;
   public string LastName
   {
      get { return _lastName; }
      private set
      {
         SetAndNotify(ref _lastName, value);

        //首选 C# 5 及更低版本,因为它提供编译时安全
         this.NotifyOfPropertyChange(() => this.FullName);
      }
   }
   public string FullName
   {
      get { return FirstName + " " + LastName; }
   }
}

您还可以在构造函数中将事物连接在一起,如下所示:

class MyClass : PropertyChangedBase
{
   private string _firstName, _lastName;

   public MyClass()
   {
      this.Bind(s => s.FirstName, (o, e) => NotifyOfPropertyChange(nameof(FullName)));
      this.Bind(s => s.LastName, (o, e) => NotifyOfPropertyChange(nameof(FullName)));
   }

   public string FirstName
   {
      get { return _firstName; }
      private set { SetAndNotify(ref _firstName, value); }
   }

   public string LastName
   {
      get { return _lastName; }
      private set { SetAndNotify(ref _lastName, value); }
   }

   public string FullName
   {
      get { return FirstName + " " + LastName; }
   }
}

调度事件

默认情况下,PropertyChanged 事件在当前线程上引发(并且 WPF 负责将它们分派到 UI 线程)。但是,如果您确实想更改此设置,则可以!PropertyChangedBase 有一个名为 PropertyChangedDispatcher 的属性,该属性具有Action,并且默认为 Execute.DefaultPropertyChangedDispatcher(您可以分配)(其值为a => a())。

如果您想将其更改为在 UI 线程上执行,您可以执行以下操作。

要更改 PropertyChangedBase 的所有实例:

class Bootstrapper : Bootstrapper<MyRootViewModel>
{
   public override void Configure()
   {
      base.Configure();
      Execute.DefaultPropertyChangedDispatcher = Execute.OnUIThread;
   }
}

只更改一次 PropertyChangedBase 实例:

lass MyClass : PropertyChangedBase
{
   public MyClass()
   {
      this.PropertyChangedDispatcher = Execute.OnUIThread;
   }
}

与 PropertyChanged.Fody 一起使用

PropertyChanged.Fody是一个很棒的包,它在编译时注入代码以自动为您的属性引发 PropertyChanged 通知,从而使您可以编写非常简洁的代码。它还将找出您的属性之间的依赖关系并适当地发出通知,例如:

class MyClass : PropertyChangedBase
{
   public string FirstName { get; private set; }
   public string LastName { get; private set; }
   public string FullName { get { return String.Format("{0} {1}", this.FirstName, this.LastName); } }

   public void SomeMethod()
   {
      // PropertyChanged notifications are automatically raised for both FirstName and FullName
      this.FirstName = "Fred";
   }

PropertyChangedBase 还注意与Fody.PropertyChanged. 引发的通知Fody.PropertyChanged使用PropertyChangedDispatcher.

因此,你不需要做任何特殊,以使用Fody.PropertyChanged与任何子类ScreenValidatingModelBasePropertyChangedBase

项目原地址:https://github.com/canton7/Stylet
当前文档原地址:https://github.com/canton7/Stylet/wiki/PropertyChangedBase

上一篇:WPF的MVVM框架Stylet开发文档 8. 事件聚合器The EventAggregator
下一篇:WPF的MVVM框架Stylet开发文档 10. 执行:调度到 UI 线程

你可能感兴趣的:(MVVM,Stylet框架,wpf,c#,开发语言)