同样,我在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触发命令?
您可以使用交互触发器来处理诸如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的方法。
[如果您不想使用交互触发器,我想展示另一种解决方案。
您可以简单地将项目变成Button
。这允许将不同的行为封装到单独的命令中。这比为了决定要采取的操作而切换项目的类型更为合适。
您只需要覆盖ControlTemplate
的TreeViewItem
,这非常简单。因为项目容器的DataContext
是数据模型,所以您可以直接在数据模型上或DataContext
本身(或任何其他源)的TreeView
上绑定到命令。
以下示例假定在SomeCommand
实例的DataContext
的TreeView
上定义了命令ProjectTree
。 CommandParameter
是实际单击的项目的数据模型:
<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
并对更改的属性执行操作。但这取决于您的情况。