Управление несколькими выборами с помощью MVVM

В своем путешествии по изучению MVVM я установил базовое понимание WPF и шаблона ViewModel. Я использую следующую абстракцию при предоставлении списка и интересуюсь одним выбранным элементом.

public ObservableCollection Orders { get; private set; } public ICollectionView OrdersView { get { if( _ordersView == null ) _ordersView = CollectionViewSource.GetDefaultView( Orders ); return _ordersView; } } private ICollectionView _ordersView; public OrderViewModel CurrentOrder { get { return OrdersView.CurrentItem as OrderViewModel; } set { OrdersView.MoveCurrentTo( value ); } } 

Затем я могу связать OrdersView с поддержкой сортировки и фильтрации в списке в WPF:

  

Это очень хорошо работает для отдельных просмотров. Но я хотел бы также поддерживать несколько вариантов в представлении и привязать модель к списку выбранных элементов.

Как мне привязать ListView.SelectedItems к свойству backer в ViewModel?

Добавьте свойство IsSelected вашему ребенку ViewModel ( OrderViewModel в вашем случае):

 public bool IsSelected { get; set; } 

Привяжите выбранное свойство к контейнеру к этому (для ListBox в этом случае):

    

IsSelected обновляется, чтобы соответствовать соответствующему полю контейнера.

Вы можете получить выбранных детей в модели просмотра, выполнив следующие действия:

 public IEnumerable SelectedOrders { get { return Orders.Where(o => o.IsSelected); } } 

Я могу заверить вас: SelectedItems действительно может быть CommandParameter как XAML CommandParameter

Существует простое решение этой общей проблемы; чтобы он работал, вы должны соблюдать ВСЕ следующие правила:

  1. Следуя предложению CommandParameter в CommandParameter к CommandParameter XAML, определите атрибут CommandParameter атрибутом Command . Это очень трудоемкая ошибка .

    введите описание изображения здесь

  2. Убедитесь, что методы CanExecute и Execute ICommand имеют параметр object типа. Таким образом, вы можете запретить исключенные исключения исключения, возникающие всякий раз, CommandParameter тип CommandParameter не соответствует типу параметра метода команды:

     private bool OnDeleteSelectedItemsCanExecute(object SelectedItems) { // Your code goes here } private bool OnDeleteSelectedItemsExecute(object SelectedItems) { // Your code goes here } 

Например, вы можете отправить свойство SelectedItems ListView / ListBox своим методам ICommand или самому ListView / ListBox . Отлично, не так ли?

Надеюсь, это мешает кому-то потратить огромное количество времени, которое я сделал, чтобы выяснить, как получить SelectedItems в качестве параметра CanExecute .

Можно попытаться создать прикрепленное свойство.

Это сохранит его, добавив свойство IsSelected для каждого IsSelected вами списка. Я сделал это для ListBox , но его можно изменить для использования в виде списка.

  

Дополнительная информация: WPF – привязка ListBox SelectedItems – прикрепленная собственность VS Style .

Если вы используете MVVM-LIGHT, вы можете использовать этот шаблон:

http://blog.galasoft.ch/archive/2010/05/19/handling-datagrid.selecteditems-in-an-mvvm-friendly-manner.aspx

Не особенно элегантный, но, похоже, он должен быть надежным хотя бы

  • Привязка OneWayToSource от свойства readonly в XAML
  • WPF: привязка ContextMenu к команде MVVM
  • Image UriSource и привязка данных
  • Принуждение WPF TextBox больше не работает в .NET 4.0
  • Привязка данных Android с использованием тега include
  • Связывание Richtextbox wpf
  • WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
  • Когда следует использовать # и = в элементах управления ASP.NET?
  • Связывание в WPF с элементом массива, заданным свойством
  • Для чего нужен DataContext?
  • Почему привязка данных WPF к исключению ласточки?
  • Давайте будем гением компьютера.