Как я могу удалить ListView формы элемента в Xamarin Cross Platform Forms MVVM

#xamarin #xamarin.forms

#xamarin #xamarin.forms

Вопрос:

Как я могу удалить ListView формы элемента в кроссплатформенных формах Xamarin

 <ViewCell.ContextActions>
        <MenuItem Text="Delete" IsDestructive="True" Command="Binding DleteItemCommand}" />
</ViewCell.ContextActions>
  

Но я хочу, чтобы пользовательский код соответствовал шаблону MVVM.

Ответ №1:

Итак, модель представления предназначена только для уровня представления, вам нужно взаимодействовать с вашей ячейкой вместо viewmodel. Выполните следующие действия:

1. Создайте наблюдаемую коллекцию ViewModels для ячеек. 2. Добавьте эту коллекцию в ItemSource ListView. 3. Затем для команды добавьте метод обратного вызова

                     <ListView x:Name="citiesListView" ItemTapped="OnSelection">
                    <ListView.ItemTemplate>
                            <DataTemplate>
                        <ViewCell>
                            <ViewCell.ContextActions>
                                <MenuItem Clicked="DeleteAction" Text="Delete" IsDestructive="true" CommandParameter="{Binding .}" />
                            </ViewCell.ContextActions>
                            <StackLayout Padding="15,0">
                                  <Label 
                                    Text="{Binding .}"
                                    FontSize="30"
                                    VerticalTextAlignment="Center"
                                    HorizontalTextAlignment="Center"/>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
  

Затем в коде:

     public partial class YourPage : ContentPage
{
    public ObservableCollection<string> YourCollection { get; set; }

    public YourPage()
    {
        InitializeComponent();
        // initialize at this point
        YourCollection = new ObservaleCollection(<Some collection of view models>);
        citiesListView.ItemsSource = YourCollection;

    }


    private void DeleteAction(object sender, System.EventArgs e)
    {
        var menuItem = ((MenuItem)sender);
        var yourViewModel = (YourViewModelType) menuItem.CommandParameter;

       YourCollection.Remove(yourViewModel);
     }
  

Ответ №2:

Вы можете добавить ObservableCollection<YourType> и удалить элемент из коллекции в командной строке.

 var collection = new ObservableCollection<YourType>();

yourList.ItemSource = collection;

// in Command
public void OnDelete (object sender, EventArgs e) 
{
    // getting reference on menu item
    var menuItem = ((MenuItem)sender).CommandParameter;    
    // cast to underlying viewModel
    var yourObject = (YourType)menuItem;
    collection.Remove(yourObject);
}
  

Комментарии:

1. Это совместимо с шаблоном MVVM?

Ответ №3:

Да, он совместим с шаблоном MVVM. Итак, у вас есть ячейка в ListView, и это единственное представление ViewModel. И, используя этот подход, у вас есть следующие отношения: «модель — ViewModel — view». В ObservableCollection есть ссылки на ViewModels, которые отображаются в ячейках ListView, и теперь вы можете легко удалять нужные ячейки. Смотрите улучшения выше в коде

Комментарии:

1. Спасибо за ваш ответ. Но как использовать это в представлении модели в Command?