gpt4 book ai didi

c# - 如何使用触发器来同步列表框选择?

转载 作者:行者123 更新时间:2023-11-30 18:26:44 25 4
gpt4 key购买 nike

我有两个绑定(bind)到同一个可观察集合的列表框。基本上一个列表框是一个文档托盘,我可以在其中拖放文档,另一个是常规列表框,我可以在其中提供编辑文件名的选项。我想突出显示两个列表框中的项目。例如,当用户在一个列表框(托盘)中选择一个文档时,我希望突出显示另一个带有文本框的列表项,同样,当我单击另一个列表框中的文本框时,我希望托盘中的项目是选择。我的代码如下。

在文档托盘列表框中,我有如下代码。

<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</Style>
</ListBox.ItemContainerStyle>

同样在另一个列表框中我有这样的样式

 <ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter Property="IsSelected" Value="True"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>

当我在文档托盘中选择一个项目时,该项目正在另一个列表框中被选中。当我单击文本框或在其他列表框中选择一个项目时,该项目未在托盘列表框中被选中。我还注意到,如果我评论焦点触发项目被适本地选择。我希望选择也能在焦点上传播。

最佳答案

我假设您通过属性将 ListBox 绑定(bind)到代码隐藏( View 模型或其他)中的数据,例如YourItems :

<ListBox ItemsSource="{Binding YourItems}">
<ListBox.ItemContainerStyle>
...
</ListBox.ItemContainerStyle>
</ListBox>

在您的代码隐藏中创建另一个集合内类型的属性(例如称为 YourSelectedItem 。然后只需在您的列表框定义中添加以下行:

<ListBox ItemsSource="{Binding YourItems}" 
SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}">

只要两者都是双向绑定(bind)的,那么它们就应该保持彼此同步。

我不会在样式中使用 setter 来设置 IsSelected(丢弃 <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" /> 行)。如果您可以绑定(bind)到代码隐藏中的公共(public)项目,ListBoxes 本身具有处理该问题的属性,如上所示。我需要尝试一下,但希望你的触发器也能工作,因为你不会有竞争 IsSelected触发器/样式。

我认为这里的关键是我发现有时如果您还通过样式设置了相同的属性,则无法通过触发器设置某些内容,因此请使用 SelectedItem在 ListBox 父级上,而不是 IsSelected每个项目的样式。

关于c# - 如何使用触发器来同步列表框选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28096614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com