0

您好,我正在尝试动态更改数据模板,但我在 TreeViewItemTemplateSelector 类中的方法 SelectTemplate 从未被调用(我已通过调试器检查过):( 请帮助我 :)

来自 xaml MainWindow 的代码:

后面代码中的代码:

4

2 回答 2

0

将 DataTemplates 从 TreeView.Resources 移动到 Window.Resources

         <Window.Resources><DataTemplate x:Key="DefaultTemplate">
            <TextBlock Text="{Binding Header}"></TextBlock>
        </DataTemplate><DataTemplate x:Key="Regulation">
            <TextBlock Text="{Binding Path=Header}" FontWeight="Bold"></TextBlock>
        </DataTemplate>

        <DataTemplate x:Key="Article">
            <TextBlock Text="{Binding Path=Header}" Foreground="Green"></TextBlock>
        </DataTemplate>        
<local:TreeViewItemTemplateSelector x:Key="TemplateSelector" DefaultTemplate="{StaticResource DefaultTemplate}"  ArticleTemplate="{StaticResource Article}" RegulationTemplate="{StaticResource Regulation}"  />

并做出改变

 <TreeView ItemTemplateSelector="{StaticResource TemplateSelector}" Height="409" HorizontalAlignment="Left" Margin="10,10,0,0" Name="treeView1" VerticalAlignment="Top" Width="277" ItemsSource="{Binding}"/>

更新代码,我们会看到。我将类似的代码放入 VS 中,它可以工作,所以我们需要仔细看看。所以我检查了这个并改变了

public class TreeViewCustomItem
{
    public string Header { get; set; }
}

还有这个

 listmy = new ObservableCollection<TreeViewCustomItem> { new TreeViewCustomItem { Header = "xD" }, new TreeViewCustomItem { Header = "xxD" } };
        //treeView1.ItemsSource = listmy;
        this.DataContext = listmy;

 public class selector : DataTemplateSelector
{

    public DataTemplate RegulationTemplate { get; set; }

    public DataTemplate DefaultTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        TreeViewCustomItem treeViewItem = item as TreeViewCustomItem;
        if (treeViewItem.Header == "xD")
        {
            return RegulationTemplate;
        }

        else
        {
            return DefaultTemplate;

        }
    }
}

在 XAML 中看起来像这样

         xmlns:local="clr-namespace:WpfApplication1.Views">
    <Window.Resources>
        <DataTemplate x:Key="DefaultTemplate">
            <TextBlock Text="{Binding Header}"></TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="Regulation">
            <TextBlock Text="{Binding Path=Header}" FontWeight="Bold"></TextBlock>
        </DataTemplate>
    <local:selector x:Key="selector_" DefaultTemplate="{StaticResource DefaultTemplate}" RegulationTemplate="{StaticResource Regulation}"/>
</Window.Resources>
    <Grid>
        <TreeView Height="409" HorizontalAlignment="Left" Margin="10,10,0,0" Name="treeView1" VerticalAlignment="Top" Width="277"  
           ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource selector_}"/>      

</Grid>

它有效,所以我的假设是问题在 TreeViewCustomItem 内部。

于 2013-09-29T18:00:38.503 回答
0

您的问题似乎是您TreeViewCustomItem的继承自TreeViewItem. (如http://pastebin.com/jnP2nWMF所示)

删除该继承(和依赖属性)会导致模板选择器正常触发。你试图用节点项目实现什么?

查看 OutputWindow,我收到以下消息:

System.Windows.Data Error: 26 : ItemTemplate and ItemTemplateSelector are ignored for items already of the ItemsControl's container type; Type='TreeViewCustomItem'

您不必让项目继承自TreeViewItem以将它们绑定到TreeView,TreeViewItemTreeView用于保存数据的东西,然后DataTemplate用于呈现数据。

于 2013-09-29T19:22:38.693 回答