gpt4 book ai didi

c# - WPF:当某个值更改时重新应用 DataTemplateSelector

转载 作者:IT王子 更新时间:2023-10-29 04:16:21 26 4
gpt4 key购买 nike

这是我拥有的 XAML:

<ItemsControl ItemsSource="{Binding Path=Groups}" ItemTemplateSelector="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=ListTemplateSelector}"/>

这是我的 ListTemplateSelector 类:

public class ListTemplateSelector : DataTemplateSelector {
public DataTemplate GroupTemplate { get; set; }
public DataTemplate ItemTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container) {
GroupList<Person> list = item as GroupList<Person>;
if (list != null && !list.IsLeaf)
return GroupTemplate;
return ItemTemplate;
}
}

GroupTemplate 数据模板在其自身内部引用了 ListTemplateSelector,所以这就是我设置它的原因。这是我唯一可以放在一起的递归技巧。但这不是我遇到的问题。

我的问题是,当 IsLeaf 属性更改时,我想从 ItemTemplate 更改为 GroupTemplate。自从它第一次读取该属性以来,这第一次工作得很好。但是一旦这个属性改变,模板选择器就不会被重新应用。现在,我可以使用触发器绑定(bind)到值并适本地设置项目模板,但我需要能够为每个项目设置不同的模板,因为它们可能处于不同的状态。

例如,假设我有一个这样的组列表:

Group 1: IsLeaf = false, so template = GroupTemplate

Group 2: IsLeaf = true, so template = ItemTemplate

Group 3: IsLeaf = false, so template = GroupTemplate

并且一旦组 1 的 IsLeaf 属性更改为 true,模板需要自动更改为 ItemTemplate。

编辑:

这是我的临时解决方案。有什么更好的方法吗?

<ItemsControl ItemsSource="{Binding Path=Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{DynamicResource ItemTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsLeaf}" Value="False">
<Setter Property="ContentTemplate" Value="{DynamicResource GroupTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

最佳答案

关于您的编辑,用 DataTemplate Trigger 代替 Style 就足够了吗?即:

<ItemsControl ItemsSource="{Binding Path=Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl x:Name="cc" Content="{Binding}" ContentTemplate="{DynamicResource ItemTemplate}"/>

<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsLeaf}" Value="False">
<Setter TargetName="cc" Property="ContentTemplate" Value="{DynamicResource GroupTemplate}"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

关于c# - WPF:当某个值更改时重新应用 DataTemplateSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3543515/

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