WPF树形控件HierarchicalDataTemplate的ItemTemplateSelector问题

3

我正在尝试在WPF(MVVM方法)中创建一个简单的2级树形视图。对于我的第一级,我有一个标准数据模板,对于我的第二级,我想使用一个模板选择器,以便可以根据其属性更改每个项的外观。

下面是我的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,则我在我的模板选择器中返回AlphaTemplate等等。
我在窗口上有一个动作(dragDrop),它将项目添加到第二级。我希望模板选择器能够根据其DataType为放置的项选择正确的数据模板。
我的主ViewModel包含TypeA对象的ICollectionView,每个TypeA ViewModel都包含TypeB ViewModel的ICollectionView。
如果需要任何帮助,请告诉我。

我在我的端上尝试了这种情况,它运行得非常好。你能分享模板选择器的代码,包括XAML和后台代码以及ListB类的类型吗? - Nitin
我已经在我的原始问题中添加了更多的代码。如果您需要其他任何信息,请告诉我。 - Krishna
不知道兄弟,我试过了,在这里运行得很好。从字典设置模板并应用它们。你能看到输出窗口中是否有任何绑定异常吗? - Nitin
没有收到任何绑定错误。模板选择器肯定返回了正确的模板(我设置了断点并检查了当我展开树形视图的第一级时)。但是我得到的只是类型“TypeBViewModel”,而不是实际的数据模板。 - Krishna
请问您能否将您的示例代码发送给我,这样我就可以与我在项目中所做的进行比较了吗? - Krishna
1个回答

2
我不知道这个有什么问题,因为需要调试代码,但是你想要实现的可以通过为您的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>

谢谢


感谢您的回复。您使用触发器的解决方案可以工作,但我正在尝试找到一种通用的解决方案,因为我正试图在项目的其他地方重用我用于Listbox的相同templateSelector。此外,我对TypeB项目有超过15个数据模板,我想把它们都放在一个地方。不过,在我使用相同TemplateSelector的另一个Listbox中,一切都很顺利(它显示正确的数据模板)。 - Krishna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接