【问题标题】:Style DataGridCell with ComboBox based on Header value使用基于 Header 值的 ComboBox 设置 DataGridCell 样式
【发布时间】:2015-06-05 18:40:44
【问题描述】:

我们有一个用户控件,它显示用户可以查看的可用 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 绑定,如果我更改一个组合框,它们都会更改为新选择的值。

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

【问题讨论】:

    标签: c# wpf datagrid combobox


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多