WPF TreeView - принудительное выполнение SelectedEvent для элемента, который уже выбран - PullRequest
2 голосов
/ 18 июня 2009

Обобщенный вопрос:
В WPF TreeView, как я могу принудительно выбрать выбранное событие для элемента, который в данный момент является выбранным элементом?

Подробная информация:
Я пытаюсь добавить функциональность в мой WPF TreeView, добавив множественный выбор, используя shift (для диапазона) и control (для переключения выбора элемента). Я реализовал свою собственную коллекцию SelectedItems, поскольку TreeView имеет только выбранный элемент. Я по-прежнему использую SelectedItem TreeView, чтобы он не нарушал функциональность клавиатуры, однако я перезаписываю существующий ItemContainerStyle, чтобы, даже если элемент был выбран, он не создавал впечатление, что он выбран. Однако мне не нужно было бы этого делать, мне нужно было только выделить фон текстового блока выбранных элементов дерева, а не всю ширину элемента, поэтому я самостоятельно выполняю изменения цвета переднего плана и фона.

1 Ответ

1 голос
/ 11 января 2010

При реализации древовидного представления WPF используется много XAML, поэтому этот ответ содержит только фрагменты кода.

Моя цель состояла в том, чтобы щелкнуть выбранный элемент дерева в левой панели и обновить элементы в правой панели (например, Windows Explorer).

Чтобы сделать выбор выбранного элемента дерева, я реализовал два события в следующем примере XAML в моей ViewModel:

  • 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;
         }
      }
}
...