如何从DataGridTemplateColumn

时间:2019-03-22 13:50:20

标签: c# wpf mvvm data-binding wpfdatagrid

我正在尝试在数据网格中创建一个组合框。到目前为止,我有此组合框的两个版本,但两个都没有按要求工作。

以下代码可以将更改保存在数据网格中,但无法加载该值(以后称为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).SelectedItem);

此行在V1上正常,但在V2上无效。所以我想知道是否有一种方法可以从DataGridTemplateColumn中获取“ SelectedItem”信息(如果可以的话,如何以及是否可以替代)。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

设置列本身的DisplayMemberPathSelectedValuePathSelectedValueBinding属性:

<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 :(得分:0)

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

最终有效,它增加了开销,但是...