В методе SearchAsync я получаю результаты обратно из репозитория. Кроме того, если я добавлю точку останова в первую строку метода, я увижу, что свойство FilteredItems содержит один элемент; тот, которым он инициализируется. Но когда страница загружается, я не вижу этот элемент в представлении коллекции. Аналогично, после поиска в представлении коллекции ничего не отображается. На вкладке «Ошибки привязки» также не отображается никаких проблем.
AutoCompletePage.xaml
Код: Выделить всё
Код: Выделить всё
public partial class AutoCompletePage : ContentPage
{
private AutoCompletePageModel _model;
public AutoCompletePage(AutoCompletePageModel model)
{
InitializeComponent();
_model = model;
}
private void InputView_OnTextChanged(object? sender, TextChangedEventArgs e)
{
_model.SearchCommand.Execute(e.NewTextValue);
}
}
Код: Выделить всё
public partial class IngredientResult : ObservableObject
{
[ObservableProperty]
public int _id;
[ObservableProperty]
public string _name = string.Empty;
[ObservableProperty]
public bool _isSelected;
}
[QueryProperty(nameof(AlreadySelected), "selected")]
public partial class AutoCompletePageModel :ObservableObject, IQueryAttributable
{
[ObservableProperty] public string _placeholder = "Search ingredients...";
[ObservableProperty] public string? _searchText;
public ObservableCollection FilteredItems { get; } = new()
{
new()
{
Id = 0,
Name="Please search for ingredients above"
}
};
private List _selectedIngredients = new();
public List? AlreadySelected { get; set; }
public void ApplyQueryAttributes(IDictionary query)
{
if (query.TryGetValue("selected", out object param) && param is List selected)
{
System.Diagnostics.Debug.WriteLine("Ingredients already selected.");
}
}
[RelayCommand]
public async Task SearchAsync(string query)
{
var searchResults = new List();
if (!string.IsNullOrWhiteSpace(query)) //TODO: Why is SearchText always null?
{
using (var db = new RecipeAssistantContext())
{
searchResults = await db.Ingredients.Where(i => i.Name.ToLower().Contains(query)).ToListAsync();
}
}
var fullResults = _selectedIngredients
.Concat(searchResults.Select(i => new IngredientResult { Id = i.Id, Name = i.Name }))
.OrderBy(i => i.IsSelected).ThenBy(i => i.Name).Take(5).ToList();
MainThread.BeginInvokeOnMainThread(() =>
{
FilteredItems.Clear();
foreach (var item in fullResults)
{
FilteredItems.Add(item);
}
});
System.Diagnostics.Debug.WriteLine(SearchText);
}
}
- Я ожидал увидеть элемент в представлении коллекции «Пожалуйста, найдите ингредиенты выше» при первой загрузке страницы, но его там нет.
- В начале и конце метода SearchAsync в FilteredItems есть элементы, но представление коллекции все равно отображается ничего.
- При выполнении метода SearchAsync SearchText имеет значение null. В какой момент это заполняется? Я попробовал нажать Enter и нажать значок, но команда не выполняется. Вот почему мне нужно было добавить обработчик событий OnTextChanged, потому что команда не работала напрямую, даже с поведением набора инструментов сообщества.
Подробнее здесь: https://stackoverflow.com/questions/798 ... g-anything
Мобильная версия