繁体   English   中英

WPF datatemplateselector没有被调用

[英]WPF datatemplateselector not getting called

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

来自xaml MainWindow的代码:

后面代码中的代码:

将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内部。

您的问题似乎是您的TreeViewCustomItemTreeViewItem继承。 (如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继承的项即可将它们绑定到TreeViewTreeViewItemTreeView用于保存数据的东西,然后使用DataTemplate来呈现数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM