使用基于Header值的ComboBox样式DataGridCell

时间:2015-06-05 18:40:44

标签: c# wpf datagrid combobox

我们有一个用户控件,显示用户可以查看的可用SQL表的组合框。每个表包含不同的数据,列数等,因此网格是自动生成的。当用户从组合框中选择不同的表时,DataView绑定到网格将通过SQL调用重新填充。

我现在有一个请求,对于其中一个表,名为SourceCodeType的列显示为只有几个值(L1,L2,L3)的组合框。

我有以下样式(和VM属性TransposeCodeTypeComboBoxValues),它显示带有值列表的ConboBox:

<Window.Resources>

    <ResourceDictionary>

            <CollectionViewSource x:Key="TransposeCodeTypeCollection"
                                  Source="{Binding RelativeSource={RelativeSource FindAncestor, 
                                            AncestorType={x:Type Window}}, Path=DataContext.TransposeCodeTypeComboBoxValues}" />

            <Style TargetType="{x:Type DataGridCell}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.Header, Mode=OneWay,

                                            Converter={StaticResource StringComparisonToBooleanConverter}, ConverterParameter='SourceCodeType'}" Value="True">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <ComboBox Name="TransposeCodeComboBox"
                                              IsReadOnly="True"
                                              ItemsSource="{Binding Source={StaticResource TransposeCodeTypeCollection}}"
                                              Width="150" />
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>

    </ResourceDictionary>
</Window.Resources>

...

<StackPanel>

                <DataGrid Name="AdjustmentTablesDataGrid" 
                          ItemsSource="{Binding AdjustmentTableDataView, UpdateSourceTrigger=PropertyChanged}"
                          SelectedItem="{Binding SelectedProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                          Margin="0,20,0,10"
                          AutoGenerateColumns="True"
                          ColumnWidth="*"
                          CanUserAddRows="False"
                          MaxHeight="500"
                          EnableRowVirtualization="True"
                          IsEnabled="True">

我想知道在加载/显示表时如何将表中的SourceCodeType绑定到正确的组合框值。

修改

我发现我可以使用以下样式的ComboBox绑定到SourceCodeType

<ComboBox Name="TransposeCodeComboBox"
          IsReadOnly="True" 
          ItemsSource="{Binding Source={StaticResource TransposeCodeTypeCollection}}"
          SelectedItem="{Binding SourceCodeType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          Width="150" />

我仍然遇到的问题是,它似乎绑定到最后一行的SourceCodeType,如果我更改了一个组合框,它们都会更改为新选择的值。

如何让样式正确绑定到每一行数据?

1 个答案:

答案 0 :(得分:0)

通过关于不同主题的另一篇文章,我找到了答案:

        <Style TargetType="{x:Type DataGridCell}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.Header, Mode=OneWay, 
                                        Converter={StaticResource StringComparisonToBooleanConverter}, ConverterParameter=DestinationCodeType}" Value="True">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                               <ComboBox Name="TransposeCodeComboBox"
                                         IsReadOnly="True" 
                                         ItemsSource="{Binding Source={StaticResource TransposeCodeTypeCollection}}"
                                         SelectedValue="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, Path=DataContext.DestinationCodeType, Mode=TwoWay}"
                                         IsSynchronizedWithCurrentItem="False"
                                         Margin="0"
                                         Width="Auto"
                                         Height="Auto" />

                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>

我遗失的重要事情是IsSynchronizedWithCurrentItem="False"