MAUI-MVVM与数据绑定

2022-09-05 10:28 Monday2401min
CC BY 4.0(除特别声明和转载)

感知数据变化

MVVM中一个重要的实践价值是视图能够感知数据的变化。手工的传统写法繁琐臃肿,NET Community Toolkit 通过源生成器来简化 MVVM,自动生成样本代码。
使用方法:

namespace MonkeyFinder.ViewModel;

public partial class BaseViewModel : ObservableObject
{
    [ObservableProperty]
    [NotifyPropertyChangedFor(nameof(IsNotBusy))]
    bool isBusy;

    [ObservableProperty]
    string title;

    public bool IsNotBusy => !IsBusy;
}

带有[ObservableProperty]特性的属性,当值改变时会通知UI。
查看生成的代码,需展开。
这是我们的 IsBusy 属性:

[global::System.CodeDom.Compiler.GeneratedCode("CommunityToolkit.Mvvm.SourceGenerators.ObservablePropertyGenerator", "8.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCode]
[global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public bool IsBusy
{
    get => isBusy;
    set
    {
        if (!global::System.Collections.Generic.EqualityComparer<bool>.Default.Equals(isBusy, value))
        {
            OnPropertyChanging(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangingArgs.IsBusy);
            isBusy = value;
            OnPropertyChanged(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedArgs.IsBusy);
            OnPropertyChanged(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedArgs.IsNotBusy);
        }
    }
}

这段代码可能看起来有点吓人,但由于它是自动生成的,它添加了额外的属性以避免冲突。 它还通过缓存进行了高度优化。

BuyMeACola