我在 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 属性中的方法的指导将不胜感激。预先感谢。
您始终可以实现完整的属性。特别是对于属性
set
或 get
正在执行其他代码(除了引发 INotifyPropertyChanged.PropertyChanged
事件)的情况,Toolkit 解决方案不提供任何优势(除了通过注入大量代码产生开销之外)。您最终也编写了样板代码 - 这次您是为一个有问题的库编写的(但我猜这是有争议的)。或者,添加一些工具包“样板代码”。
Toolkit 在生成实际属性时注入了一堆事件调用器以及事件前和事件后方法。
在您的情况下,例如,
OnPersonChanging
(On[property_name]Changing)和OnPersonChanged
。由于这些是实例成员,您可以简单地使用 partial
语言功能来扩展它们并创建一个部分方法:
[ObservableProperty]
string person;
partial void OnPersonChanged(string? oldValue, string? newValue)
=> LoadPerson();
在 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
命令关联。