在TreeView HierarchicalDataTemplate中使用Style

时间:2014-11-11 22:50:20

标签: c# wpf xaml treeview

我是新手,无法退出获得正确的语法。这可以正确捕获树视图中文本框的Left Mouse click

<HierarchicalDataTemplate 
                DataType="{x:Type r:NetworkViewModel}" 
                ItemsSource="{Binding Children}"
                >
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding NetworkIP}" Width="110" >
                             <TextBlock.InputBindings>
                                    <MouseBinding MouseAction="LeftClick"
                                    Command="{Binding DataContext.SelectItem, RelativeSource={RelativeSource FindAncestor, AncestorType=TreeView}}"
                                    CommandParameter="{Binding}" />
                             </TextBlock.InputBindings>
                        </TextBlock>

                    </StackPanel>
                </HierarchicalDataTemplate>

如何使用Style中的Resources块来完成此操作? 目标是为TextBoxes中的所有TreeView使用相同的样式。可能位于Usercontrol.Resources并由HierarchicalDataTemplate引用的内容。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以在控件或窗口资源中使用目标类型(与键x:Key=...相对)定义模板,以使其自动应用于树视图中的所有项目。

这是一个小例子,在窗口资源中定义了一个模板,其中包含InputBindings定义。如果ItemViewModelItemsControl未明确定义其他模板,则此模板将自动应用于TreeView类型的所有对象。在此示例中,项目以简单的ItemsControl显示,但它适用于TreeView。{/ p>

请注意,要使其正常工作,TreeView中的所有项目都必须属于同一类型。 如果它们来自相同的基本类型是不够的。如果Template.DataType中定义的类型与ViewModel 的类型完全相同,则仅应用模板。如果TreeView ItemsScource包含混合类型,则需要分别为每种类型指定模板。

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:loc="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <DataTemplate DataType="{x:Type loc:ItemViewModel}">
            <TextBlock Text="{Binding Name}" Width="110" >
                <TextBlock.InputBindings>
                    <MouseBinding 
                        MouseAction="LeftClick"
                        Command="{Binding SelectItem}" />
                </TextBlock.InputBindings>
            </TextBlock>
        </DataTemplate>
    </Window.Resources>

    <Grid>
        <ItemsControl ItemsSource="{Binding Items}" />
    </Grid>
</Window>