使用 CommunityToolkit.Mvvm 当 ObservableProperty 更改时调用方法

Sam*_*Sam 7 c# observablecollection community-toolkit-mvvm

CommunityToolkit.Mvvm我在 .NET MAUI 应用程序中实现自动完成功能,并在视图模型中使用代码生成器来处理可观察的属性。

我有以下代码,我正在尝试在更改GetSuggestions()时调用方法SearchText

[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(GetSuggestions))]
string searchText;

[ObservableProperty]
bool showSuggestions;

ObservableCollection<string> Suggestions { get; } = new();

private async Task GetSuggestions()
{
   if(string.IsNullOrEmpty(SearchText) || SearchText.Length < 3)
      return;

   var data = await _myApiService.GetSuggestions(SearchText.Trim());
   if(data != null && data.Count > 0)
   {
      Suggestions.Clear();
      foreach(var item in data)
         Suggestions.Add(item);

      ShowSuggestions = true;
   }
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

[NotifyCanExecuteChangedFor] 的目标必须是可访问的 IRelayCommand 属性,但“GetSuggestions”在类型 MyViewModel 中没有匹配项。

我在这里做错了什么?

Ric*_*ato 12

我想这里有两个问题。

为什么会出现这个错误?

发生这种情况是因为GetSuggestions不是命令。尝试将该[RelayCommand]属性添加到您的方法中。

[RelayCommand]
private async Task GetSuggestions()
{
    if(string.IsNullOrEmpty(SearchText) || SearchText.Length < 3)
       return;

    var data = await _myApiService.GetSuggestions(SearchText.Trim());
    if(data != null && data.Count > 0)
    {
        Suggestions.Clear();
        foreach(var item in data)
        Suggestions.Add(item);

        ShowSuggestions = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后链接NotifyCanExecuteChangedFor到自动生成的命令。

[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(GetSuggestionsCommand))]
string searchText;
Run Code Online (Sandbox Code Playgroud)

第二个。

你需要

当 SearchText 更改时调用 GetSuggestions() 方法。

NotifyCanExecuteChangedFor属性不执行此操作。

在自动生成的源代码中,您应该找到一个名为 的空部分方法OnSearchTextPropertyChanged。尝试实施它。

partial void OnSearchTextPropertyChanged(string value)
{
    GetSuggestions();
}
Run Code Online (Sandbox Code Playgroud)

如果这是您要搜索的内容,GetSuggestions则不需要使用该RelayCommand属性进行标记。