如何使TreeView预先选择当前项目,该项目是用户控件

时间:2017-01-24 11:38:57

标签: wpf xaml treeview

我有一个TreeView,它绑定到复杂类型的分层集合。

<TreeView Name="treeCategories" SelectedValuePath="{Binding SelectedCategory, RelativeSource={RelativeSource AncestorType=UserControl}}">
        <HierarchicalDataTemplate DataType="{x:Type LocalCategories:BaseCategory}" ItemsSource="{Binding Subcategories}">
            <TextBlock Text="{Binding DisplayName}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

分层渲染现在可以正常工作,但我无法让树预先选择当前项目&#39;。当前项是用户控件的依赖项属性,定义为

public BaseCategory SelectedCategory { .. }

我确保它有价值,虽然在设置此值时我不是100%确定 - 在渲染树之前或之后?如果是之后,则可以解释问题。

我试过了:

SelectedValuePath="{Binding SelectedCategory, RelativeSource={RelativeSource AncestorType=UserControl}}"

SelectedValuePath="SelectedCategory"

但是我无法让它发挥作用。

如何让TreeView预先选择一个&#39;当前项&#39;,这是用户控件的依赖属性,其中定义了树?

修改

我在想,也许我可以使用项目样式来检查项目的基础对象是否等于我选择的对象&#39;。

<TreeView.ItemContainerStyle>
  <Style TargetType="TreeViewItem">
    <Style.Triggers>
      <DataTrigger Binding="{Binding SelectedCategory, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="TreeViewItem.UnderlyingObject">
        <Setter Property="IsSelected" Value="True" />
      </DataTrigger>
    </Style.Triggers>
  </Style>
</TreeView.ItemContainerStyle>

在上面的陈述中,我如何访问BaseCategory的基础TreeViewItem对象,以便我可以进行比较并使用数据触发器?

1 个答案:

答案 0 :(得分:0)

您可以使用行为将TreeView的SelectedItem属性绑定到SelectedCategory源属性。

有关如何执行此操作的示例,请参阅以下博文:https://blog.magnusmontin.net/2014/01/30/wpf-using-behaviours-to-bind-to-readonly-properties-in-mvvm/

<TreeView xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
          Name="treeCategories">
    <i:Interaction.Behaviors>
        <local:TreeViewSelectedItemBlendBehavior
                    SelectedItem="{Binding SelectedCategory, RelativeSource={RelativeSource AncestorType=UserControl}}" />
    </i:Interaction.Behaviors>
    <TreeView.Resources>
        ...
    </TreeView.Resources>
</TreeView>