【发布时间】: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 绑定,如果我更改一个组合框,它们都会更改为新选择的值。
如何让样式正确绑定到每一行数据?
【问题讨论】: