Как получить информацию о выбранном элементе из DataGridTemplateColumn

#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}}"/>
  

в конечном итоге сработало, это добавило накладных расходов, но…