C# 在用户控件内设置treeview的ItemTemplateSelector

C# 在用户控件内设置treeview的ItemTemplateSelector,c#,wpf,xaml,treeview,datatemplate,C#,Wpf,Xaml,Treeview,Datatemplate,我创建的用户控件有问题。此控件由搜索文本框和树视图组成。树视图为不同的节点类型显示不同的数据模板。因此,我使用datatemplate类型的依赖属性创建了usercontrol,在使用我的控件时可以绑定该属性。在控件内部,treeview绑定到dependency属性。但遗憾的是,treeviewtemplate选择器没有被调用 <UserControl x:Class="yyy.yyy.yyy.UI.UserControls.SearchableTreeView.SearchableTr

我创建的用户控件有问题。此控件由搜索文本框和树视图组成。树视图为不同的节点类型显示不同的数据模板。因此,我使用datatemplate类型的依赖属性创建了usercontrol,在使用我的控件时可以绑定该属性。在控件内部,treeview绑定到dependency属性。但遗憾的是,treeviewtemplate选择器没有被调用

<UserControl x:Class="yyy.yyy.yyy.UI.UserControls.SearchableTreeView.SearchableTreeView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:behaviours="clr-namespace:yyy.yyy.yyy.UI.Behaviours;assembly=yyy"
         mc:Ignorable="d"
         x:Name="parent"
         d:DesignHeight="300" d:DesignWidth="300">
<DockPanel DataContext="{Binding ElementName=parent}">
    <TextBox DockPanel.Dock="Top" Margin="5" Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}"/>
    <TreeView DockPanel.Dock="Top" Margin="5" ItemsSource="{Binding TreeViewItems}" ItemTemplateSelector="{Binding TreeViewTemplateSelector}">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="HorizontalContentAlignment" Value="Left" />
                <Setter Property="VerticalContentAlignment" Value="Center" />
                <Setter Property="behaviours:TreeViewItemBehaviour.IsBroughtIntoViewWhenSelected" Value="true"/>
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Setter Property="Visibility" Value="Visible"/>
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </Trigger>
                    <DataTrigger Binding="{Binding Path=IsVisible}" Value="false">
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
</DockPanel>
usercontrol在xaml中使用,如下所示:

    public partial class SearchableTreeView : UserControl
  {
public SearchableTreeView()
{
  InitializeComponent();
}

public static readonly DependencyProperty TreeViewTemplateSelectorProperty = DependencyProperty.Register(
  "TreeViewTemplateSelector", typeof (DataTemplateSelector), typeof (SearchableTreeView), new PropertyMetadata(default(DataTemplateSelector)));

public DataTemplateSelector TreeViewTemplateSelector
{
  get { return (DataTemplateSelector) GetValue(TreeViewTemplateSelectorProperty); }
  set { SetValue(TreeViewTemplateSelectorProperty, value); }
}


}
    <searchableTreeView:SearchableTreeView TreeViewTemplateSelector="{StaticResource TreeViewFieldTemplateSelector}"/>

其中TreeViewFieldTemplateSelector是一个datatemplateselector类型的类,allready在我开始从可搜索的treeview创建usercontrol之前就已经工作过了

有人知道我做错了什么吗?或者无法将datatemplateselector直接绑定到treeview

谢谢


Manuel

使用
DataTemplateSelector
使系统变得复杂。虽然这些对象确实是为此目的而创建的,但是有一种更容易的方法来实现您的需求。基本上,如果为每个数据类型声明一个
DataTemplate
,而不指定
x:Key
值,则它们将隐式应用于正确类型的所有对象:

<DataTemplate DataType="{x:Type YourPrefix:YourDataType">
    ...
</DataTemplate>
<DataTemplate DataType="{x:Type YourPrefix:YourOtherDataType">
    ...
</DataTemplate>
<DataTemplate DataType="{x:Type YourPrefix:SomeOtherDataType">
    ...
</DataTemplate>

我知道,这会更容易,但问题是我必须选择DataTemplate,而不是针对不同类型的对象。对象内部有一个属性,DataTemplateSelector使用该属性告诉wpf应该使用哪个模板。Thx!就这样。几分钟前我在那里找到了这个解决方案。问题是我必须将treeview绑定到代码隐藏文件中的dependency属性,但是数据上下文是控件的视图模型。
<DockPanel>
    <TextBox DockPanel.Dock="Top" Margin="5" Text="{Binding SearchText, 
         UpdateSourceTrigger=PropertyChanged}"/>
    <TreeView DockPanel.Dock="Top" Margin="5" ItemsSource="{Binding TreeViewItems}"
        ItemTemplateSelector="{Binding TreeViewTemplateSelector, RelativeSource={
        RelativeSource AncestorType={x:Type YourPrefix:SearchableTreeView}}}">
        <TreeView.ItemContainerStyle>
            ...
        </TreeView.ItemContainerStyle>
    </TreeView>
</DockPanel>