我在一个视图中有多个组合框,每个组合框都在自己的行上并绑定到同一个 ItemsSource。 它们有一个元素名称来区分它们。 在我看来,在 window.resources 下,我有一个定义为数据模板的七个用户控件的列表。 我想做的是,当用户从组合框中选择一个项目时,它会根据组合框选择在相应组合框旁边的列中显示七个用户控件之一的内容。 我使用在 ContentControl.style 标签中定义的数据触发器完成了此操作。 问题是,当我在一个组合框中进行选择时,恰好与另一个组合框的选择相同,内容显示在最近选择的组合框旁边,但从另一个组合框中消失。
我已经定义了一个带有样式和数据触发器的内容控件,只要我只有一个组合框,我就可以看到内容正在正确更新。 但是,它不适用于多个组合框。 我不明白即使我将 DataTrigger 绑定元素名称设置为特定组合框的名称,在该组合框上进行选择也会影响与不同元素名称和组合框绑定的另一行的内容。
<Window.Resources>
<local:OneLayout x:Key="OneLayout" />
<DataTemplate DataType="{x:Type local:OneLayout}" >
</DataTemplate>
<local:TwoLayout x:Key="TwoLayout" />
<DataTemplate DataType="{x:Type local:TwoLayout}" >
</DataTemplate>
....
<ComboBox x:Name="Layout1" Margin="5" Grid.Row="0" Grid.Column="1"
ItemsSource="{Binding LayoutTypes }" DisplayMemberPath="Name"/>
<ContentControl Grid.Row="0" Grid.RowSpan="3" Grid.Column="2">
<ContentControl.Style>
<Style TargetType="{ x:Type ContentControl }" >
<Setter Property="Content" Value="
{StaticResource ResourceKey=OneLayout}" />
<Style.Triggers>
<DataTrigger Binding="{Binding
SelectedItem.Layout, ElementName=Layout1}"
Value="One">
<Setter Property="Content"
Value="{StaticResource ResourceKey=OneLayout}" />
</DataTrigger>
<DataTrigger Binding="{Binding
SelectedItem.LayoutType, ElementName=Layout1}"
Value="Two">
<Setter Property="Content"
Value="{StaticResource ResourceKey=TwoLayout}" />
</DataTrigger>
......
<ComboBox x:Name="Layout2" Margin="5" Grid.Row="3" Grid.Column="1"
ItemsSource="{Binding LayoutTypes }" DisplayMemberPath="Name"/>
<ContentControl Grid.Row="3" Grid.RowSpan="3" Grid.Column="2" >
... //same as content control above except for
//ElementName="Layout2"
我希望与组合框选择关联的用户控件显示在所选组合框旁边,并且不会影响其他行中的内容。
在ComboBox
中,将IsSynchronizedWithCurrentItem
属性设置为 false
这个问题的答案是由黛西·田提供的,可以在这里找到。
https://social.msdn.microsoft.com/Forums/vstudio/en-US/790c8348-6d9e-4c40-a0f1-8855b773d1c9/contentcontrol-using-datatriggers-usercontrol-content-displays-in-one-row-but-removes-content?forum=wpf#c54413a2-f1e3-4ab2-9bf9-cdd4f15f58c0