Предоставление 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.

Другие вопросы по тегам