如何将网格绑定到WPF中的选定树视图项

时间:2014-03-12 20:07:36

标签: c# wpf mvvm mvvm-light

如何将网格绑定到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方式处理点击事件。

1 个答案:

答案 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处理PreviewMouseDownGrid的{​​{1}}事件。你可以找到许多关于使用DataTemplate来处理事件的在线文档,所以我不会在这里再说一遍。但是,如果你这样做了(这是更好的解决方案),那么你可以这样做:

AttachedProperty