0

こんにちは、データテンプレートを動的に変更しようとしていますが、クラス TreeViewItemTemplateSelector のメソッド SelectTemplate が呼び出されません (デバッガーで確認しました) :( 助けてください :)

xaml MainWindow からのコード:

分離コード内のコード:

4

2 に答える 2

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アイテムを から継承する必要はありません。 はがデータを保持するために使用し、 はデータをTreeViewItem表示するために使用されます。TreeViewDataTemplate

于 2013-09-29T19:22:38.693 に答える
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 に答える