簡體   English   中英

WPF Treeview HierarchicalDataTemplate ItemTemplateSelector

[英]WPF Treeview HierarchicalDataTemplate ItemTemplateSelector

我試圖在WPF(MVVM方法)中創建一個簡單的2級Treeview。 對於我的第一個級別,我有一個標准的數據模板,對於我的第二個級別,我想使用模板選擇器,以便我可以根據其中一個屬性更改每個項目的外觀。

下面是我的Treeview xaml

<Treeview ItemsSource={Binding ListA}>
      <TreeView.ItemTemplate>
       <HierarchicalDataTemplate ItemsSource="{Binding ListB}" ItemTemplateSelector={StaticResource TemplateSelector}>
         <Textblock Text={Binding Name}/>
      </HierarchicalDataTemplate>
   </TreeView.ItemTemplate>
</TreeView>

我的第一個級別是

<Textblock Text={Binding Name}/> 

只會顯示一個名字

對於我的第二級,TemplateSelector返回一個類似的數據模板

<DataTemplate x:Key="SomeKey">
<StackPanel Orientation="Horizontal">
<ViewBox>
-----
</ViewBox>
<TextBlock Text={Binding Name}/>
</StackPanel>
</DataTemplate>

但我在第二級看到的只是我的第二級ViewModel名稱。 我仔細檢查了模板選擇器,它肯定會返回正確的數據模板,但它只是沒有顯示。

有誰能指出我正確的方向?

編輯 - 根據請求添加更多代碼

這是我的模板選擇器

public class DataFieldsDataTemplateSelector : DataTemplateSelector
{
public DataTemplate AlphaTemplate { get; set; }
public ------
public ------
public DataFieldsDataTemplateSelector()
{
//This is getting the template from my ResourceDictionary
AlphaTemplate = (DataTemplate)dDictionary["alphaTemplate"];
}
public override DataTemplate SelectTemplate(object item,DependencyObject container)
        {
//Somecode
return AlphaTemplate;
}
}

我字典中的AlphaTemplate模板是

<DataTemplate x:Key="alphaTemplate">

            <Grid >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="15"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Viewbox  IsHitTestVisible="False">

                    <Path Data="M0,0L56.622002,0 56.622002,14.471 35.715,14.471 35.715,64 20.715,64 20.715,14.471 0,14.471z" Stretch="Uniform" Fill="{DynamicResource ButtonForegroundNormal}" VerticalAlignment="Center" Width="15" Height="15" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5">
                        <Path.RenderTransform>
                            <TransformGroup>
                                <TransformGroup.Children>
                                    <RotateTransform Angle="0" />
                                    <ScaleTransform ScaleX="1" ScaleY="1" />
                                </TransformGroup.Children>
                            </TransformGroup>
                        </Path.RenderTransform>
                    </Path>

                </Viewbox>
                <textBlock Text="{Binding Name}/>
            </Grid>
    </DataTemplate>

我的類TypeB包含一個Name(Text)和DataType(Text)字段,如果DataType是Alpha我在templateSelector中返回AlphaTemplate等等

我在窗口上有一個動作(dragDrop),它將項目添加到第二級。 我希望模板選擇器應該根據其DataType為該刪除的項目選擇正確的datatemplate

我的主ViewModel包含TypeA對象的ICollectionView,每個TypeA ViewModel包含TypeB ViewModels的ICollectionView。

你有任何需要都請告訴我

我不知道這有什么問題,因為這需要調試代碼,但你想要實現的是通過為TypeB定義默認的DataTemplate並根據綁定切換內容,如下所示:

<DataTemplate DataType="{x:Type TypeB}">
    <ContentControl>
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <!-- Default template here for your item -->
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding XYZ}" Value="true">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <!-- Different template for your item -->
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>        
</DataTemplate>

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM