如何调用CommunityToolkit.MVVM中[ObservableProperty]的Setter属性中的方法?

问题描述 投票:0回答:2

我在 MainViewModel 中使用 CommunityToolkit.MVVM 来减少样板代码。但是,我在调用 [ObservableProperty] 的 setter 属性中的方法时遇到问题。

以前,在迁移到源生成器之前,我有一个 setter,可以在其中调用如下方法:

private string _person;
public string Person
{
    get { return _person; }
    set 
    { 
        SetProperty(ref _person, value);
        LoadPerson();
    }
}

private void LoadPerson()
{
    _person = "Hello";
}

迁移到源生成器并使用 [ObservableProperty] 后,我不确定如何调用 LoadPerson() 方法。这是我当前的代码:

[ObservableProperty]
string person; // How can I call LoadPerson() here?

[RelayCommand]
private void LoadPerson()
{
    Person = "Hello World";
}

任何关于如何调用 [ObservableProperty] 的 setter 属性中的方法的指导将不胜感激。预先感谢。

c# .net wpf sourcegenerators community-toolkit-mvvm
2个回答
0
投票

您始终可以实现完整的属性。特别是对于属性

set
get
正在执行其他代码(除了引发
INotifyPropertyChanged.PropertyChanged
事件)的情况,Toolkit 解决方案不提供任何优势(除了通过注入大量代码产生开销之外)。您最终也编写了样板代码 - 这次您是为一个有问题的库编写的(但我猜这是有争议的)。
由于 Visual Studio 中有代码完成和代码模板,因此您不必键入属性的代码。只需输入“prop”并按两次 Tab 键即可。现在您已拥有为您生成的属性,并且仍处于完全控制之中。

或者,添加一些工具包“样板代码”。
Toolkit 在生成实际属性时注入了一堆事件调用器以及事件前和事件后方法。
在您的情况下,例如,

OnPersonChanging
On[property_name]Changing)和
OnPersonChanged
。由于这些是实例成员,您可以简单地使用
partial
语言功能来扩展它们并创建一个部分方法:

[ObservableProperty]
string person;

partial void OnPersonChanged(string? oldValue, string? newValue)
  => LoadPerson();

0
投票

在 CommunityToolkit.MVVM 中,

[ObservableProperty]
属性用于通过 INotifyPropertyChanged 实现生成属性。但是,它并不像传统方法那样直接支持在 setter 中调用方法。

如果您想在属性更改时执行其他操作,可以使用

ObservableObject
基类提供的 PropertyChanged 事件。以下是如何实现此目标的示例:

using Microsoft.Toolkit.Mvvm.ComponentModel;
using Microsoft.Toolkit.Mvvm.Input;

public class MainViewModel : ObservableObject
{
    private string _person;

    [ObservableProperty]
    public string Person
    {
        get { return _person; }
        set
        {
            SetProperty(ref _person, value);
            LoadPerson();
        }
    }

    private void LoadPerson()
    {
        // Additional logic when Person changes
        // You can also use the Person property here
        // e.g., string loadedPerson = Person;
    }

    [RelayCommand]
    private void LoadPersonCommand()
    {
        Person = "Hello World";
    }
}

在此示例中,

ObservableObject
类提供了
SetProperty
方法和
PropertyChanged
事件。
SetProperty
方法处理属性分配并引发
PropertyChanged
事件。通过重写属性的 setter 并在设置值后调用
LoadPerson
方法,您可以实现所需的行为。

注意:如果您对方法使用

[RelayCommand]
属性,请确保方法名称带有后缀“Command”。在此示例中,
LoadPerson
LoadPersonCommand
命令关联。

© www.soinside.com 2019 - 2024. All rights reserved.