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

标签 c# wpf binding datatemplateselector

这是我拥有的 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/

相关文章:

c# - 对象类型具有 ToString()、GetHashCode()、GetType 等方法的原因是什么

c# - 如何让 entityFramework 在创建数据库之前询问我;

c# - 文件下载后要执行的代码在 Asp.net 中不起作用

c# - 在 WPF 4.5 中使用 INotifyDataErrorInfo 创建显示控件所有 Validation.Errors 的工具提示

python - Kivy:访问不同类上的方法

c# - 如何使用 MVP 中的模型填充数据 GridView

c# - 如何将 Signalr 扩展到大量用户

WPF - 通过考虑用户任务栏最大化无边框窗口

c# - 功能区控件专注于按钮单击

c# - 如何动态更新 MvvmCross 中的绑定(bind)?