#c# #wpf #mvvm #data-binding #wpfdatagrid
#c# #wpf #mvvm #привязка к данным #wpfdatagrid
Вопрос:
Я пытаюсь создать поле со списком в datagrid. Пока у меня есть две версии этого выпадающего списка, и ни одна из них не работает должным образом.
Следующий код может сохранять изменения в datagrid, но не может загрузить значение (позже упоминается как V1)
<DataGridComboBoxColumn Header="Direction" Width="*">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="DisplayMemberPath" Value="Name"/>
<Setter Property="SelectedValuePath" Value="Type"/>
<Setter Property="SelectedValue" Value="{Binding dt}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.paramDirection}"/>
<Setter Property="DisplayMemberPath" Value="Name"/>
<Setter Property="SelectedItem" Value="{Binding dt}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
Следующий код может загрузить значение, но не может его сохранить (позже упоминается как V2)
<DataGridTemplateColumn Header="ColumnHeader">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding dt.Name}" IsEnabled="False"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox x:Name="cmbbx" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.paramDirection}" DisplayMemberPath="Name" SelectedItem="{Binding dt}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
Я получаю доступ к значению в окне со списком через событие для командной функции
currentCellValue = (((ComboBox)e.EditingElement).Выбранный элемент);
Эта строка отлично работает на версии V1, но не на версии V2. Итак, я хочу знать, есть ли способ получить информацию ‘SelectedItem’ из DataGridTemplateColumn (если да, то как, а если нет, то каковы альтернативы).
Любая помощь была бы высоко оценена.
Ответ №1:
Задайте DisplayMemberPath
, SelectedValuePath
и SelectedValueBinding
свойства самого столбца:
<DataGridComboBoxColumn Header="Direction" Width="*" DisplayMemberPath="Name" SelectedValuePath="Type" SelectedValueBinding="{Binding dt}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.paramDirection}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.paramDirection}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
Комментарии:
1. Привет, mm8, я опробовал вашу реализацию (и различные перестановки той же логики), но у нее был тот же результат, что и в версии V1, где я могу сохранить значение, но не могу его извлечь. ‘dt’ — это элемент, который хранит значение, которое я пытаюсь отобразить при запуске, а paramDirection — это список допустимых параметров для выпадающего списка (если это поможет)
2. @Kid-Seven-7: Какой тип dt и где определено свойство dt? Какой ItemsSource у вашей DataGrid?
3. О, так получается, что моей главной проблемой был тот факт, что я реализовал свой INotifyPropertyChanged в моей модели вместо моей ViewModel. После рефакторинга кода для правильной реализации mvvm были решены более серьезные проблемы: $. Спасибо за помощь, хотя, извините за это
4. @Kid-Seven-7: Мой ответ все еще действителен. Вы должны установить свойства самого столбца.
Ответ №2:
<ObjectDataProvider x:Key="Dir" MethodName="GetValues" ObjectType="{x:Type system:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type Type="pDIR:ParameterDirection"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
Установка моих параметров в качестве StaticResource и привязка к Direction
<DataGridComboBoxColumn Width="*" Header="Direction" SelectedItemBinding="{Binding Direction}" ItemsSource="{Binding Source={StaticResource Dir}}"/>
в конечном итоге сработало, это добавило накладных расходов, но…