Я работаю с представлением WPF с Prism.MVVM, которое позволяет нашим пользователям редактировать записи. Изначально запись для редактирования выбиралась через ComboBox.
<ComboBox IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Records}"
SelectedItem="{Binding SelectedRecord}"/>
Это сработало, но пользователям нужен был более эффективный способ определения того, какие записи содержат поля, требующие обновления, поэтому мы добавили DataGrid только для чтения, который они могут сортировать и визуально определять, какие записи их интересуют. Затем они хотят выбрать запись для редактирования. вне сетки (но сохраните поле со списком). Здесь что-то идет не так.
В идеале поведение, которое мы ищем:
Если пользователь выбирает запись из поля со списком:
- The selected record is loaded in the form
- Выбранная запись отображается как выбранная в поле со списком.
- Выбранная запись отображается как выбранная в сетке.
Если пользователь выбирает запись в сетке
- single click to select record.
- Выбранная запись загружается в форму
- Выбранная запись отображается как выбранная в поле со списком
- Выбранная запись отображается как выбранная в сетке.
Самая успешная попытка
Запуск команды при событии SelectionChanged DataGrid
<DataGrid x:Name="TheDataGrid"
ItemsSource="{Binding Source={StaticResource GridRecords}}"
SelectedItem="DataContext.SelectedRecord, ElementName=LayoutRoot, Mode=OneWay}">
...
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction CommandParameter="{Binding SelectedItem, ElementName=TheDataGrid}"
Command="{Binding DataContext.SelectRecordFromGridCommand, ElementName=LayoutRoot}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Команда делегата:
Public ReadOnly Property SelectRecordFromGridCommand As DelegateCommand(Of TheRecordType) = new DelegateCommand(Of TheRecordType)(Sub(r) SelectedRecord = r)
Это было предпринято с различными вариантами режима привязки SelectedItem
. Если привязка DataGrid SelectedItem
удалена, мы получим 1,2,4,5,6 и 7. но выбор записи из поля со списком не покажет запись, выбранную в сетке.
Если для привязки DataGrid SelectedItem
установлено значение OneWay
, выбор записи с помощью поля со списком прерывается: настройка SelectedRecord
запускает событие SelectionChanged в DataGrid, которое использует значение до события и эффективно возвращает все к исходному значению.
Это можно исправить, введя контрольный элемент в набор свойств в модели представления.
Private _selectedRecord As TheRecordType
Private _enableRecordSelection As Boolean = true
Public Property SelectedRecord As TheRecordType
Get
Return _selectedRecord
End Get
Set(value As TheRecordType)
If _enableRecordSelection
_enableRecordSelection = false
SetProperty(_selectedRecord , value)
_enableRecordSelection = true
End If
End Set
End Property
Это действительно работает, и мы придумали это, когда писали вопрос, но кажется ужасно хакерским. Моя интуиция подсказывает мне, что должен быть лучший способ, поэтому я все еще спрашиваю:
Есть ли чистый (желательно только xaml) способ настроить это?
Другие наиболее успешные вещи, которые мы пробовали:
Прямая конфигурация XAML для DataGrid с двусторонней привязкой
<DataGrid x:Name="TheDataGrid"
ItemsSource="{Binding Source={StaticResource GridRecords}}"
SelectedItem="DataContext.SelectedRecord, ElementName=LayoutRoot, Mode=TwoWay}"/>
При этом мы удовлетворяем требованиям с 1 по 6; однако при выборе записи через сетку всегда выделяется предыдущая запись вместо текущей.
DataGrid.InputBindings
<DataGrid.InputBindings>
<MouseBinding Gesture="LeftClick"
CommandParameter="{Binding SelectedItem, ElementName=TheDataGrid}"
Command="{Binding DataContext.SelectRecordFromGridCommand, ElementName=LayoutRoot}"/>
</DataGrid.InputBindings>
Без привязки SelectedItem
это ведет себя так же, как без привязки InteractionTrigger
к SelectionChanged
, за исключением того, что пользователь должен выполнить несколько действий с мышью. Первый щелчок выделяет строку в сетке (фактическое выделение жирным синим цветом). Второй щелчок запускает команду.
С привязкой OneWay
к SelectedItem
это ведет себя аналогично прямой конфигурации xaml, опять же, за исключением необходимости многократного щелчка.
Еще раз, чтобы повторить вопрос: есть ли более чистый способ выполнить 7 требований, чем прибегать к контрольному значению в установщике свойств?