Я пытаюсь удалить объект с именем SelectedOrder в TableData моей модели представления. Привязка работает отлично, но когда я нажал на элемент, который нужно удалить, в моей модели представления переменная SelectedOrder имеет значение null, когда активируется RelayCommand... Не могли бы вы сказать мне, почему?
<CollectionView
ItemsSource = "{Binding Orders}"
SelectedItem = "{Binding SelectedOrder}">
<CollectionView.ItemTemplate>
<DataTemplate>
<Frame>
<Frame.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding Source = {RelativeSource AncestorType = {x:Type viewmodels:MainPageViewModel}}, Path=DeleteOrderCommand}" NumberOfTapsRequired = "1" />
</Frame.GestureRecognizers>
<Label
FontSize = "Medium"
HorizontalOptions = "Start"
Text = "{Binding Id}"
VerticalTextAlignment = "Center" />
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
<CollectionView.ItemsLayout>
<LinearItemsLayout ItemSpacing = "5" Orientation = "Vertical" />
</CollectionView.ItemsLayout>
</CollectionView>
[ObservableProperty]
private Order selectedOrder;
[RelayCommand]
private async Task DeleteOrder()
{
App.OrdersRepo.TestDeleteItem(SelectedOrder);
Orders = await App.OrdersRepo.TestGetItems();
}
В чем проблема?
общественный недействительный TestDeleteItem (T элемент) {попробуйте {connection.Delete (элемент); } catch (Exception ex) { StatusMessage = $"Ошибка: {ex.Message}"; } } У ViewModel больше ничего нет. все работает нормально, но когда я останавливаю программу на точке останова, чтобы увидеть переменную SelectedOrder, она равна нулю. Я думаю, это должно быть связано с фреймом страницы контента или чем-то еще.. –
Я пробовал, но та же проблема...
На основе вашего кода я создал на своей стороне демо-версию и обнаружил, что если мы вызовем событие Frame.GestureRecognizers
внешнего фрейма, то событие SelectionChangedCommand
CollectionView не будет запущено. Таким образом, значение SelectedOrder
не будет обновляться при нажатии Frame
.
Но в качестве обходного пути вы можете передать текущий элемент событию DeleteOrderCommand
.
Вы можете добавить CommandParameter = "{Binding .}"
для TapGestureRecognizer
рамки.
Пожалуйста, обратитесь к следующему коду:
<CollectionView.ItemTemplate>
<DataTemplate>
<Frame BackgroundColor = "pink" >
<Frame.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding Source = {RelativeSource AncestorType = {x:Type local:MainPageViewModel}}, Path=DeleteOrderCommand }" CommandParameter = "{Binding .}" NumberOfTapsRequired = "1" />
</Frame.GestureRecognizers>
<Label
FontSize = "Medium"
HorizontalOptions = "Start"
Text = "{Binding Id}"
VerticalTextAlignment = "Center" />
</Frame>
</DataTemplate>
</CollectionView.ItemTemplate>
А затем добавьте параметр в метод DeleteOrder
[RelayCommand]
private async Task DeleteOrder(Order obj)
{
// do something
//App.OrdersRepo.TestDeleteItem(obj);
// Orders = await App.OrdersRepo.TestGetItems();
}
Хороший! Большое спасибо!
Какой код
App.OrdersRepo.TestDeleteItem()
? Не могли бы вы опубликовать полный код вашей модели представления?