汇总问题:
在WPF TreeView中,如何在当前所选项目的项目上强制选择事件?
详细信息:
我试图通过使用shift(用于范围)和控制(用于切换项目的选择)添加multiselect来为我的WPF TreeView添加功能。我已经实现了自己的SelectedItems集合,因为TreeView只有一个选定的项目。我仍然使用TreeView的SelectedItem,因此它不会破坏键盘功能,但是我会覆盖现有的ItemContainerStyle,这样即使选择了一个项目,它也不会给出它被选中的外观。然而,我不需要这样做,我只需要突出显示所选树视图项目的文本块的背景,而不是项目的整个宽度,所以我自己处理前景色和背景色。 / p>
答案 0 :(得分:1)
实现WPF树视图使用了大量的XAML,所以这个答案只包含代码片段。
我的目标是在左窗格中单击选定的树视图项并刷新右窗格中的项目(如Windows资源管理器)。
要选择所选的树视图项,我在ViewModel的以下XAML示例中实现了两个事件:
当我的MouseLeftButtonUp事件触发时,我确保指示我使用以下方式处理事件:
这是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;
}
}
}