WPF:重新DataTemplateSelector时一定值的变化 [英] WPF: Reapply DataTemplateSelector when a certain value changes

查看:1106
本文介绍了WPF:重新DataTemplateSelector时一定值的变化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此​​,这里是我有XAML:

 <的ItemsControl的ItemsSource ={绑定路径=组}ItemTemplateSelector ={绑定的RelativeSource = {的RelativeSource AncestorType =窗口},路径= ListTemplateSelector}/>

下面是我的ListTemplateSelector类:

 公共类ListTemplateSelector:DataTemplateSelector {
公众的DataTemplate GroupTemplate {搞定;组; }
公众的DataTemplate的ItemTemplate {搞定;组; }
公众覆盖的DataTemplate SelectTemplate(对象项目,DependencyObject的容器){
    群组列表<&人GT;表=项目作为群组列表<人取代;
    如果(名单= NULL&放大器;!&安培;!list.IsLeaf)
        返回GroupTemplate;
    返回的ItemTemplate;
}
}

该GroupTemplate数据模板里面引用本身ListTemplateSelector,所以这就是为什么我已成立了像我有它设置。这是唯一的递归黑客,我可以放在一起。但是,这不是我有问题。

我的问题是,我想从ItemTemplate中改变时GroupTemplate的传递isLeaf属性更改。这工作很漂亮的第一时间,因为它读取属性的第一次。但是,一旦这个属性的变化,模板选择没有得到重新应用。现在,我可以使用触发器绑定到的价值,并设置适当的项目模板,但我需要可以设置不同的模板为每个项目,因为它们可能处于不同的状态。

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


  

第1组:传递isLeaf = false,所以模板= GroupTemplate


  
  

第2组:传递isLeaf = true,所以模板=的ItemTemplate


  
  

第3组:传递isLeaf = false,所以模板= GroupTemplate


和一次第1组的传递isLeaf属性更改为true,模板需要自动切换到的ItemTemplate。

编辑:

下面是我的临时解决方案。任何更好的办法做到这一点?

 <的ItemsControl的ItemsSource ={绑定路径=组}>
< ItemsControl.ItemTemplate>
    <&DataTemplate的GT;
        < ContentControl中CONTENT ={结合}>
            < ContentControl.Style>
                <风格的TargetType ={X:类型ContentControl中}>
                    < setter属性=的ContentTemplateVALUE ={DynamicResource的ItemTemplate}/>
                    < Style.Triggers>
                        < D​​ataTrigger绑定={绑定路径=传递isLeaf}VALUE =FALSE>
                            < setter属性=的ContentTemplateVALUE ={DynamicResource GroupTemplate}/>
                        < / DataTrigger>
                    < /Style.Triggers>
                < /样式和GT;
            < /ContentControl.Style>
        < / ContentControl中>
    < / DataTemplate中>
< /ItemsControl.ItemTemplate>
< / ItemsControl的>


解决方案

关于你的编辑,就不会一个DataTemplate触发足够,而不是使用样式?这就是:

 <的ItemsControl的ItemsSource ={绑定路径=组}>
    < ItemsControl.ItemTemplate>
        <&DataTemplate的GT;
            < ContentControl中X:NAME =CCCONTENT ={}绑定的ContentTemplate ={DynamicResource的ItemTemplate}/>            < D​​ataTemplate.Triggers>
                < D​​ataTrigger绑定={结合路径=传递isLeaf}VALUE =FALSE>
                    <二传手的TargetName =CC属性=的ContentTemplateVALUE ={DynamicResource GroupTemplate}/>
                < / DataTrigger>
            < /DataTemplate.Triggers>        < / DataTemplate中>
    < /ItemsControl.ItemTemplate>
< / ItemsControl的>

So here is the XAML that I have:

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

Here is my ListTemplateSelector class:

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

The GroupTemplate data template references the ListTemplateSelector inside itself, so this is why I have set up like I have it set up. It's the only recursive hack I could put together. But that's not the problem I'm having.

My problem is, I want to change from ItemTemplate to GroupTemplate when the IsLeaf property changes. This works beautifully the very first time since it reads the property the first time. But once this property changes, the template selector doesn't get reapplied. Now, I could use triggers to bind to the value and set the item template appropriately, but I need to be able to set a different template for each item, as they could be in a different state.

For instance, say I have a list of groups like this:

Group 1: IsLeaf = false, so template = GroupTemplate

Group 2: IsLeaf = true, so template = ItemTemplate

Group 3: IsLeaf = false, so template = GroupTemplate

And once group 1's IsLeaf property changes to true, the template needs to automatically change to ItemTemplate.

EDIT:

Here is my temporary solution. Any better way to do it?

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

解决方案

Regarding your EDIT, wouldn't a DataTemplate Trigger be enough instead of using a Style? That is:

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

这篇关于WPF:重新DataTemplateSelector时一定值的变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆