如何在WPF树视图中实现用于选择树节点的命令

问题描述 投票:0回答:2

同样,我在WPF树视图中有些迷路。当在节点上单击并在该命令中获取其值时,我在树视图中填充了一些数据,并想触发一个命令。

我的treeview-xaml看起来像这样:

        <TreeView DataContext="{Binding ProjectTree}" ItemsSource="{Binding ProjectNode}" DockPanel.Dock="Left" Margin="0 0 2 0" x:Name="ProjectTree" Grid.Column="0">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                <Setter Property="FontWeight" Value="Normal"/>
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                <StackPanel Orientation="Horizontal">
                    <Image Margin="3" Source="{Binding ItemType, Converter={x:Static misc:TreeItemImageConverter.Instance }}" Width="20" />
                    <TextBlock VerticalAlignment="Center" Text="{Binding Name}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

如何单击此处的treeviewitem触发命令?

wpf xaml treeview
2个回答
0
投票

您可以使用交互触发器来处理诸如SelectedItemChanged之类的事件:

<TreeView DataContext="{Binding ProjectTree}"
            ItemsSource="{Binding ProjectNode}" 
            x:Name="ProjectTree"
            xmlns:i="http://schemas.microsoft.com/xaml/behaviors">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectedItemChanged" >
            <i:InvokeCommandAction Command="{Binding MouseEnterCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <TreeView.ItemContainerStyle>
        ...
    </TreeView.ItemContainerStyle>
    ...
</TreeView>

Handling events in an MVVM WPF application

How to add System.Windows.Interactivity to project?

但是为什么不只将SelectedItem属性绑定到源属性并在此设置器中处理逻辑呢?这将是MVVM的方法。


0
投票

[如果您不想使用交互触发器,我想展示另一种解决方案。

您可以简单地将项目变成Button。这允许将不同的行为封装到单独的命令中。这比为了决定要采取的操作而切换项目的类型更为合适。

您只需要覆盖ControlTemplateTreeViewItem,这非常简单。因为项目容器的DataContext是数据模型,所以您可以直接在数据模型上或DataContext本身(或任何其他源)的TreeView上绑定到命令。

以下示例假定在SomeCommand实例的DataContextTreeView上定义了命令ProjectTreeCommandParameter是实际单击的项目的数据模型:

<TreeView DataContext="{Binding ProjectTree}" 
          ItemsSource="{Binding ProjectNode}">
  <TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="TreeViewItem">
            <Border BorderBrush="{TemplateBinding BorderBrush}"
                    Background="{TemplateBinding Background}"
                    BorderThickness="{TemplateBinding BorderThickness}">
              <Button Content="{TemplateBinding Content}"
                      Command="{Binding RelativeSource={RelativeSource AncestorType=TreeView}, Path=DataContext.SomeCommand}"
                      CommandParameter="{Binding}" />
            </Border>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </TreeView.ItemContainerStyle>
</TreeView>

但是按照@ mm8的建议,您可以考虑绑定到TreeView.SelectedItem并对更改的属性执行操作。但这取决于您的情况。

© www.soinside.com 2019 - 2024. All rights reserved.