![](/img/trans.png)
[英]C# CommunityToolkit.Mvvm ObservableProperty on a list
[英]Call method when ObservableProperty changes using CommunityToolkit.Mvvm
我正在我的 .NET MAUI 应用程序中实现自动完成功能,并且在我的视图 model 中使用CommunityToolkit.Mvvm
代码生成器来处理可观察的属性。
我有以下代码,我正在尝试在SearchText
更改时调用GetSuggestions()
方法。
[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;
}
}
这给了我以下错误:
[NotifyCanExecuteChangedFor] 的目标必须是可访问的 IRelayCommand 属性,但“GetSuggestions”在类型 MyViewModel 中没有匹配项。
我在这里做错了什么?
我想这里有两个问题。
发生这种情况是因为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;
}
}
然后将NotifyCanExecuteChangedFor
链接到自动生成的命令。
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(GetSuggestionsCommand))]
string searchText;
你需要
SearchText 更改时调用 GetSuggestions() 方法。
NotifyCanExecuteChangedFor
属性不这样做。
在自动生成的源代码中,您应该找到一个名为OnSearchTextPropertyChanged
的空部分方法。 尝试实施它。
partial void OnSearchTextPropertyChanged(string value)
{
GetSuggestions();
}
如果这是您要搜索的内容, GetSuggestions
不需要使用RelayCommand
属性进行标记。
仅意味着对@RMinato 的回答的更多修正。
正如我的评论所说:“虽然其中大部分内容都有帮助,但我需要做一些不同的事情,包括使用[RelayCommand]
并将我的OnPropChanged
方法中的方法调用为Task.Run(() => this.MyMethodAsync()).Wait();
”。
我的代码看起来像:
[QueryProperty(nameof(Course), nameof(Course))]
public partial class CourseDetailViewModel : BaseViewModel
{
private readonly CourseService courseService;
public CourseDetailViewModel(CourseService courseService)
{
this.courseService = courseService;
}
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(GetCourseDetailCommand))]
Course course;
partial void OnCourseChanged(Course value)
{
Task.Run(() => this.GetCourseDetailAsync()).Wait();
}
[RelayCommand]
public async Task GetCourseDetailAsync()
{
if (GetCourseDetailCommand.IsRunning) return;
try
{
IsBusy = true;
course = await courseService.GetCourseDetailAsync(course.Id);
}
catch (Exception ex)
{
Debug.WriteLine($"Failed to get course detail. Error: {ex.Message}");
await Shell.Current.DisplayAlert("Error!",
$"Failed to get course detail: {ex.Message}", "OK");
throw;
}
finally
{
IsBusy = false;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.