Управление несколькими выборами с помощью 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:
Это очень хорошо работает для отдельных просмотров. Но я хотел бы также поддерживать несколько вариантов в представлении и привязать модель к списку выбранных элементов.
- WPF MVVM INotifyPropertyChanged Implementation - модель или ViewModel
- Как обнаружить сломанные привязки данных WPF?
- Связывание WPF ComboBox с пользовательским списком
- Похоже, что привязки данных не обновляются
- Перетаскивание из источника данных в окно WPF не работает
Как мне привязать ListView.SelectedItems к свойству backer в ViewModel?
- Обход проблемы из-за отсутствия оператора 'nameof' в C # для безопасного хранения данных по типу?
- Что означает «{Binding Path =.}» В привязке WPF?
- Как я могу привязать данные строк к ListBox в WPF / WP7?
- ItemsControl с несколькими DataTemplates для viewmodel
- Какие подходы доступны для фиктивных данных времени разработки в WPF?
- Нажатие свойств GUI только для чтения обратно в ViewModel
- WPF перед записью
- WPF привязка к локальной переменной
Добавьте свойство IsSelected
вашему ребенку ViewModel ( OrderViewModel
в вашем случае):
public bool IsSelected { get; set; }
Привяжите выбранное свойство к контейнеру к этому (для ListBox в этом случае):
IsSelected
обновляется, чтобы соответствовать соответствующему полю контейнера.
Вы можете получить выбранных детей в модели просмотра, выполнив следующие действия:
public IEnumerable SelectedOrders { get { return Orders.Where(o => o.IsSelected); } }
Я могу заверить вас: SelectedItems
действительно может быть CommandParameter
как XAML CommandParameter
Существует простое решение этой общей проблемы; чтобы он работал, вы должны соблюдать ВСЕ следующие правила:
-
Следуя предложению
CommandParameter
вCommandParameter
кCommandParameter
XAML, определите атрибутCommandParameter
атрибутомCommand
. Это очень трудоемкая ошибка . -
Убедитесь, что методы
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, вы можете использовать этот шаблон:
Не особенно элегантный, но, похоже, он должен быть надежным хотя бы