2009-06-18 90 views
2

总结问题:
在WPF TreeView中,如何强制所选事件对当前选定项目的项目?WPF TreeView - 强制SelectedEvent对已选择的项目

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

回答

1

实现一个WPF树视图使用大量的XAML,所以这个答案只包含代码片段。

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

要选择被选中的TreeView项工作中,我实现了两个事件在我的视图模型下面的XAML代码示例:

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

当我的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; 
     } 
     } 
}