如何使用触发器同步ListBox选择?

时间:2015-01-22 18:58:32

标签: c# wpf

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

在“文档托盘”列表框中,我的代码如下所示。

<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>

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

1 个答案:

答案 0 :(得分:0)

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

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

创建代码隐藏中集合内的另一个属性(例如,名为YourSelectedItem。然后在Listbox定义的BOTH中添加以下行:

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

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

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

我认为这里的关键是我发现有时你不能通过触发设置一些内容如果你也通过样式设置相同的属性,那么在ListBox父项上使用SelectedItem,而不是每个项目都有IsSelected样式。