Así que aquí está el XAML que tengo:WPF: Volver a aplicar DataTemplateSelector cuando un cierto valor cambia
<ItemsControl ItemsSource="{Binding Path=Groups}" ItemTemplateSelector="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=ListTemplateSelector}"/>
Aquí es mi clase 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;
}
}
La plantilla de datos GroupTemplate hace referencia a la ListTemplateSelector dentro de la propia , así que esta es la razón por la que configuré como lo tengo configurado. Es el único truco recursivo que pude armar. Pero ese no es el problema que estoy teniendo.
Mi problema es que quiero cambiar de ItemTemplate a GroupTemplate cuando la propiedad IsLeaf cambia. Esto funciona maravillosamente la primera vez, ya que lee la propiedad la primera vez. Pero una vez que esta propiedad cambia, el selector de plantilla no se vuelve a aplicar. Ahora, podría usar activadores para vincular el valor y establecer la plantilla del elemento de forma adecuada, pero necesito poder establecer una plantilla diferente para cada elemento, ya que podrían estar en un estado diferente.
Por ejemplo, decir que tengo una lista de grupos de la siguiente manera:
Grupo 1: isLeaf = false, por lo que la plantilla = GroupTemplate
Grupo 2: isLeaf = true, por lo que la plantilla = ItemTemplate
grupo 3: isLeaf = false, por lo que la plantilla = GroupTemplate
Y una vez isLeaf cambios en las propiedades del grupo de 1 a verdadero, el templat e necesita cambiar automáticamente a ItemTemplate.
EDITAR:
Aquí está mi solución temporal. ¿Alguna mejor forma de hacerlo?
<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>
Para mayor claridad, ¿descartó el enfoque de DataTemplateSelector a favor de desencadenantes, o trabajó los factores desencadenantes en la solución con el DataTemplateSelector también? – alastairs
@alastairs No puedo hablar por OP, pero los desencadenadores parecen hacer innecesario el DataTemplateSelector. – piedar