2014-03-12 44 views
2

如何将网格绑定到WPF中选定的树视图项目?简而言之,当我的应用程序的用户点击树形视图项目时,我想运行将加载一些数据并将其呈现在网格上的命令。基于项目的基础类型,我想绑定到不同的命令。如何将网格绑定到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方式单击事件。

回答

3

在WPF中,我们通过定义不同的DataTemplate s来处理不同的数据类型。就你而言,你可能已经定义了一些。如果不是,现在就这样做,在这些DataTemplate s中,您可以设置相关的ICommand s。您可以通过几种方式做到这一点,但最简单的方法就是定义内部有一个“空白” 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> 

UPDATE >>>

这似乎奇怪,你说你不能选择与ButtonTreeViewItem。但是,你可以尝试使用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来处理一个GridPreviewMouseDown事件在DataTemplate秒。你可以在AttachedProperty之间找到很多关于处理事件的在线文档,所以我不会在这里再次讲述。但是,如果你这样做(这是更好的解决方案),那么你可以那么做这样的事情:

<DataTemplate DataType="{x:Type YourDataTypePrefix:YourDataType}"> 
    <Grid Attached:MouseEvents.PreviewMouseDown="{Binding SomeCommand}"> 
     <!-- Define your YourDataType item content here --> 
    </Grid> 
</DataTemplate> 
+0

这个答案似乎确定,但我有一个问题 - 现在我的'TreeViewItem'不可选(当我点击它时没有蓝色的矩形)... –

+0

我想你误解了我 - 说我的'TreeViewItem'不可选我的意思只是我说的括号之间 - 没有蓝色(或任何其他)的选择围绕着'TreeViewItem'。除此之外,一切正常 - 意味着命令运行。 –

+0

你想看看蓝色的选择颜色吗?如果你想看到它,请尝试向'Button'添加一个'Margin'。 – Sheridan

相关问题