我们有一个用户控件,显示用户可以查看的可用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,如果我更改了一个组合框,它们都会更改为新选择的值。
如何让样式正确绑定到每一行数据?
答案 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"
。