gpt4 book ai didi

c# - WPF Treeview HierarchicalDataTemplate ItemTemplateSelector

转载 作者:行者123 更新时间:2023-11-30 17:03:24 26 4
gpt4 key购买 nike

我正在尝试在 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 包含名称(文本)和数据类型(文本)字段如果 DataType 是 Alpha,我会在我的 templateSelector 中返回 AlphaTemplate 等等

我在窗口上有一个操作(拖放),它将项目添加到第二级。我希望模板选择器应该根据其数据类型为该删除的项目选择正确的数据模板

我的主 ViewModel 包含 TypeA 对象的 ICollectionView,每个 TypeA ViewModel 包含 TypeB ViewModel 的 ICollectionView。

如果有任何需要,请告诉我

最佳答案

我不知道这有什么问题,因为这需要调试代码,但您可以通过为 TypeB 定义默认 DataTemplate 并根据绑定(bind)切换内容来实现您想要实现的目标,如下所示:

<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>

谢谢

关于c# - WPF Treeview HierarchicalDataTemplate ItemTemplateSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18614763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com