ComboBox 选择根据定义的数据触发器样式在一行中显示用户控件内容,但从另一行中删除内容
ComboBox selection displaying usercontrol content based on defined data trigger style in one row but removing content from another row
我在一个视图中有多个组合框,每个组合框都在自己的行上并绑定到相同的 ItemsSource。它们有一个元素名称来将它们彼此区分开来。在我看来,在 window.resources 下,我有一个定义为数据模板的七个用户控件的列表。我想要做的是,当用户从组合框中选择一个项目时,它会根据组合框选择在相应组合框旁边的列中显示七个用户控件之一的内容。我使用 ContentControl.style 标记中定义的数据触发器完成了此操作。问题是,当我在一个组合框中进行选择时,恰好与另一个组合框的选择相同,内容出现在最近选择的组合框中,但从另一个组合框中消失。
我已经定义了一个带有样式和数据触发器的内容控件,只要我只有一个组合框,我就可以看到内容正在正确更新。但是,它不适用于多个组合框。我不明白即使我将 DataTrigger Binding elementname 设置为特定组合框的名称,在该组合框上进行选择会影响与不同元素名称和组合框相关联的另一行的内容。
<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
这个问题的答案由 Daisy Tian 提供,可以在这里找到....
我在一个视图中有多个组合框,每个组合框都在自己的行上并绑定到相同的 ItemsSource。它们有一个元素名称来将它们彼此区分开来。在我看来,在 window.resources 下,我有一个定义为数据模板的七个用户控件的列表。我想要做的是,当用户从组合框中选择一个项目时,它会根据组合框选择在相应组合框旁边的列中显示七个用户控件之一的内容。我使用 ContentControl.style 标记中定义的数据触发器完成了此操作。问题是,当我在一个组合框中进行选择时,恰好与另一个组合框的选择相同,内容出现在最近选择的组合框中,但从另一个组合框中消失。
我已经定义了一个带有样式和数据触发器的内容控件,只要我只有一个组合框,我就可以看到内容正在正确更新。但是,它不适用于多个组合框。我不明白即使我将 DataTrigger Binding elementname 设置为特定组合框的名称,在该组合框上进行选择会影响与不同元素名称和组合框相关联的另一行的内容。
<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
这个问题的答案由 Daisy Tian 提供,可以在这里找到....