如何将网格绑定到WPF中的选定树视图项?简而言之,当我的应用程序的用户点击树视图项目时,我想运行将加载一些数据并将其呈现在网格上的命令。根据项目的基础类型,我想绑定到不同的命令。
XAML
<TreeView ItemsSource="{Binding Path=SomeCollection, UpdateSourceTrigger=PropertyChanged}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=., Converter={StaticResource GetElementTypeConverter}}" Value="{x:Type Models:SomeType}">
// WHAT CODE GOES HERE?
</DataTrigger>
<DataTrigger Binding="{Binding Path=., Converter={StaticResource GetElementTypeConverter}}" Value="{x:Type Models:SomeOtherType}">
// WHAT CODE GOES HERE?
</DataTrigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
我想以MVVM方式处理点击事件。
答案 0 :(得分:3)
在WPF中,我们通过定义不同的DataTemplate
来处理不同的数据类型。在你的情况下,你可能已经定义了一些。如果没有,请立即执行此操作,在这些DataTemplate
中,您可以设置相关的ICommand
。您可以通过多种方式执行此操作,但一种简单的方法就是在“空白”内定义您的内容。 Button
:
<DataTemplate DataType="{x:Type YourDataTypePrefix:YourDataType}">
<Button Command="{Binding SomeCommand}">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<!-- Define your YourDataType item content here -->
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
<DataTemplate DataType="{x:Type YourDataTypePrefix:OtherDataType}">
<Button Command="{Binding SomeOtherCommand}">
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<!-- Define your OtherDataType item content here -->
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
更新&gt;&gt;&gt;
您说您无法使用TreeViewItem
选择Button
,这似乎很奇怪。但是,您可以尝试使用ToggleButton
绑定到TreeViewItem.IsSelected
属性,而不是:
<ToggleButton Command="{Binding SomeCommand}" IsChecked="{Binding IsSelected,
RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}">
<ToggleButton.Template>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<!-- Define your YourDataType item content here -->
</Grid>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
如果仍然无效,请使用AttachedProperty
处理PreviewMouseDown
中Grid
的{{1}}事件。你可以找到许多关于使用DataTemplate
来处理事件的在线文档,所以我不会在这里再说一遍。但是,如果你这样做了(这是更好的解决方案),那么你可以这样做:
AttachedProperty