2

总结性问题:
在 WPF TreeView 中,如何强制在当前是选定项目的项目上选择事件?

详细信息:
我正在尝试通过使用 shift(用于范围)和控件(用于切换项目的选择)添加多选来向我的 WPF TreeView 添加功能。我已经实现了我自己的 SelectedItems 集合,因为 TreeView 只有一个选定的项目。我仍然使用 TreeView 的 SelectedItem 以便它不会破坏键盘功能,但是我会覆盖现有的 ItemContainerStyle 以便即使选择了一个项目,它也不会给出它被选中的外观。但是,我不需要这样做,我只需要突出显示所选树视图项目的文本块的背景,而不是项目的整个宽度,因此我自己处理前景和背景颜色的变化。

4

1 回答 1

1

实现 WPF 树视图会使用大量 XAML,因此此答案仅包含代码片段。

我的目标是单击左窗格中的选定树视图项目并刷新右窗格中的项目(如 Windows 资源管理器)。

为了使选择选定的树视图项起作用,我在我的 ViewModel 中的以下 XAML 示例中实现了两个事件:

  • OnItemSelected 使用事件 TreeViewItem.Selected
  • MouseLeftButtonUp 使用事件 TreeViewItem.MouseLeftButtonUp

当我的 MouseLeftButtonUp 事件触发时,我确保表明我使用以下方法处理了该事件:

  • args.Handled = true;

这是 XAML

<TreeView Name="MyTreeView" 
    ItemsSource="{Binding Collections}" 
    Margin="0"                           
    Grid.Row="0"
    TreeViewItem.Selected="OnItemSelected"
    TreeViewItem.Unselected="OnItemUnSelected">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <EventSetter Event="TreeViewItem.MouseLeftButtonUp" Handler="MouseLeftButtonUp"/>
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>

    <!-- other XAML removed for this answer-->

</TreeView>

这是事件处理程序

private void OnItemSelected(object sender, RoutedEventArgs e)
{
     // do something...
}


// additional info: cannot detect mouse down events; preview mouse events also work
private void MouseLeftButtonUp(object sender, MouseButtonEventArgs args)
{
   TreeViewItem tvi = sender as TreeViewItem;
   if (tvi != null)
   {
      // process folder items
      MyViewModel fvm = tvi.Header as MyViewModel;
      if (fvm != null)
      {
         // only process selected treeview items
         if (fvm.IsSelected)
         {
            fvm.IsSelected = true;

            // prevent bubbling once we find the  selected tree view item
            args.Handled = true;
         }
      }
}
于 2010-01-11T03:00:02.580 回答