WPF ツリービューの実装には多くの XAML が使用されるため、この回答にはコードの断片のみが含まれています。
私の目標は、左側のペインで選択したツリービュー アイテムをクリックし、右側のペイン (Windows エクスプローラーなど) でアイテムを更新することでした。
選択したツリービュー アイテムの選択を機能させるために、ViewModel で次の XAML の例に 2 つのイベントを実装しました。
- イベント TreeViewItem.Selected を使用した OnItemSelected
- イベント TreeViewItem.MouseLeftButtonUp を使用した MouseLeftButtonUp
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;
}
}
}