Предоставление ObservableCollection как DependencyProperty
Я видел другие вопросы:
Свойство зависимости ObservableCollection не обновляется при удалении элемента в коллекции
Привязка MVVM к пользовательскому элементу управления со свойством зависимостей ObservableCollection
... даже...
https://go4answers.webhost4life.com/Example/databinding-observable-collection-196835.aspx
Но они либо делают то, что я не делаю, либо я просто не понимаю.
- Я использую MVVM.
- У меня есть DataGrid в представлении, которое содержит список членов.
- Когда пользователь щелкает правой кнопкой мыши DataGrid, у меня открывается меню RelayCommands (связанное с ViewModel), которое открывается.
- Если пользователь выбирает более одного члена, я хочу, чтобы MergeMember.CanExecute вернул true.
- Поскольку я не могу связать с коллекцией SelectedItems, у меня есть DependencyProperty в представлении, которое я заполняю при изменении выбора.
Моя проблема заключается в том, что DependencyProperty запускает изменение, когда изменяется само свойство (т. Е. ObservableCollection "обновляется"), но не при изменении элементов в коллекции.
Другие решения, которые я видел, ловят изменения в View, я пытаюсь уведомить ViewModel об изменении.
Как уведомить ViewModel об изменениях в коллекции DependencyProperty?
Я могу опубликовать примеры кода, если вы чувствуете необходимость, но это беспорядок из всех вещей, которые я пробовал.
1 ответ
Обычно в описываемой вами ситуации я использую это решение. Чтобы узнать, какие предметы в вашем DataGrid
выбраны (в приложении MVVM) вам не нужно выставлять ObservableCollection
как свойство зависимости.
В вашем DataGridRow
модель вы добавляете свойство:
public bool IsSelected
{
get
{
return isSelected;
}
set
{
if (isSelected != value)
{
isSelected = value;
OnPropertyChanged("IsSelected"); // if you are implementing INotifyPropertyChanged
}
}
}
Что касается XAML, в вашей DataGrid вы можете использовать стиль для привязки IsSelected
имущество:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=People}">
<DataGrid.Columns>
<!-- your columns are here -->
</DataGrid.Columns>
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />
</Style>
</DataGrid.ItemContainerStyle>
</DataGrid>
Таким образом, в ViewModel вы всегда знаете, какие элементы выбраны без подписки на события, и вы можете написать свою логику в CanExecute
метод вашего MergeMember RelayCommand.