我正在我的 Xamarin Forms 5 應用程式的視圖模型中實作我自己的自動完成版本。
我需要從MVVM 屬性呼叫async查找函式。Keyword不確定我是否處理得當。見下文:
string keyword { get; set; }
ObservableRangeCollection<string> suggestions = new ObservableRangeCollection<string>();
public string Keyword
{
get => keyword;
set
{
if(keyword == value)
return;
keyword = value;
OnPropertyChanged();
// If keyword has at least 3 characters, get suggestions
if(keyword.length > 2)
GetSuggestions(keyword).Wait();
}
}
ObservableRangeCollection<string> Suggestions
{
get => suggestions;
set
{
if(sugggestions == value)
return;
suggestions = value;
OnPropertyChanged();
}
}
async Task GetSuggestions(string searchKeyword)
{
var result = await _myApiService.GetSuggestions(searchKeyword);
if(result != null)
{
Suggestions = new ObservableRangeCollection(result);
OnPropertyChanged(Suggestions);
}
}
我將不勝感激任何更正或建議。謝謝。
uj5u.com熱心網友回復:
您絕對不想在這里阻塞異步代碼(如我的博客中所述)。更一般地說,您不想阻止 UI,尤其是當您的用戶正在與它互動時(即,打字)。
相反,使用異步資料系結之類的模式來(同步)啟動操作,然后在結果出現時更新您的 UI。
例如,NotifyTask<T>從這里使用:
string keyword { get; set; }
NotifyTask<List<string>> suggestions;
public string Keyword
{
get => keyword;
set
{
if (keyword == value)
return;
keyword = value;
OnPropertyChanged();
// If keyword has at least 3 characters, get suggestions
if (keyword.length > 2)
suggestions = NotifyTask.Create(GetSuggestionsAsync(keyword));
}
}
NotifyTask<List<string>> Suggestions
{
get => suggestions;
}
async Task<List<string>> GetSuggestionsAsync(string searchKeyword)
{
return await _myApiService.GetSuggestions(searchKeyword);
}
然后,不是將資料系結到Suggestions作為 的集合,而是將string資料系結到Suggestions.Result。您還可以將資料系結到Suggestions.IsCompleted(或Suggestions.IsNotCompleted)以顯示加載/忙碌指示器,并Suggestions.IsFaulted顯示錯誤訊息。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446863.html
