.net CommunityToolkit.Mvvm:更改源生成的属性设置器行为

x4shl7ld  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(158)

正如主题所说,是否可以在源代码生成的setter方法中“注入”一些null检查?我使用CommunityToolkit.Mvvm8.1.0.0
对于这个演示,我有一个简单的类Test,它有一个私有字段_someProperty,在它的顶部有[ObservableProperty]

源码生成的setter和getter

public object SomeProperty
{
    get => _someProperty;
    set
    {
        if (!global::System.Collections.Generic.EqualityComparer<object>.Default.Equals(_someProperty, value))
        {
            OnSomePropertyChanging(value);
            OnPropertyChanging(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangingArgs.SomeProperty);
            _someProperty = value;
            OnSomePropertyChanged(value);
            OnPropertyChanged(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedArgs.SomeProperty);
        }
    }
}

我的目标:相同,但注入了null检查

public object SomeProperty
{
    get => _someProperty;
    set
    {
        if (value is null)
            return;
        if (!global::System.Collections.Generic.EqualityComparer<object>.Default.Equals(_someProperty, value))
        {
            OnSomePropertyChanging(value);
            OnPropertyChanging(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangingArgs.SomeProperty);
            _someProperty = value;
            OnSomePropertyChanged(value);
            OnPropertyChanged(global::CommunityToolkit.Mvvm.ComponentModel.__Internals.__KnownINotifyPropertyChangedArgs.SomeProperty);
        }
    }
}

我只是想检查value是否为null,并省略在setter中设置它。在我的项目中,我有两个DataGrid和TreeView处理SelectedItem事件。它们绑定到同一个SelectedOobject。此对象在构造函数中初始化,我真的不希望它为null。如果刷新DataGrid,可能会发生这种情况(过滤的原因)和SelectedOobject可能在当前视图中不可用,它会自动设置为null。我宁愿仍然使用旧对象(旧引用),而不是null,这使得在每个方法中检查它变得烦人。

brccelvz

brccelvz1#

对于这种情况,我的“变通方法”是创建另一个具有[ObservableProperty]属性的_tmpSomeProperty。将此属性绑定到SelectedItem DataGrid。然后创建partial方法:

partial void OnTmpSomePropertyChanged(object value)
{
    if (value is null)
        return;
    // do other checks if needed
    SomeProperty = value;
}

用这种方法我可以控制SomeProperty。它是不是有点多余?我想...但它按我想的那样工作。

相关问题