wpf xaml datatemplate contentcontrol datatemplateselector

wpf - ¿Actualiza explícitamente DataTemplate desde un DataTemplateSelector?



bind c# (4)

Al igual que la respuesta de Jens, en lugar de crear una nueva instancia, puede usar la instancia existente del DataTemplateSelector .

var currentSelector = MyContentControl.ContentTemplateSelector; MyContentControl.ContentTemplateSelector = null; MyContentControl.ContentTemplateSelector = currentSelector;

Configuré un ContentControl.DataTemplateSelector a mi deseado.
Quiero que de acuerdo con un comando o lo que sea, llame a ContentControl para volver a seleccionar la plantilla del selector mediante xaml o código.

Gracias


Supongo que incluso voy más tarde a la fiesta, pero para una idea diferente que pueda ayudar a alguien ...

También puede intentar usar un ValueConverter en la propiedad ContentTemplate ContentControl lugar de un DataTemplateSelector .

Simplemente tenga una propiedad en su DataContext para vincular, como ScreenNumber por ejemplo. Luego, en el ValueConverter devuelva la DataTemplate que está asociada con ScreenNumber .

Ejemplo de ValueConverter:

public class ValueDataTemplateConverter : IValueConverter { public DataTemplate TemplateA { get; set; } public DataTemplate TemplateB { get; set; } public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is ValueType valueType) switch (valueType) { case ValueType.TypeA: return TemplateA; case ValueType.TypeB: return TemplateB; } return null; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }

Ejemplo de recurso xaml:

<converters:ValueDataTemplateConverter x:Key="ValueDataTemplateConverter"> <converters:ValueDataTemplateConverter.TemplateA> <DataTemplate> <TextBox Text="{Binding Value}" /> </DataTemplate> </converters:ValueDataTemplateConverter.TemplateA> <converters:ValueDataTemplateConverter.TemplateB> <DataTemplate> <CheckBox IsChecked="{Binding Value}" /> </DataTemplate> </converters:ValueDataTemplateConverter.TemplateB> </converters:ValueDataTemplateConverter>


Tarde a la fiesta, lo sé. =)

Cuando me enfrenté a este problema, me resultó más fácil establecer explícitamente un nuevo TemplateSelector como

MyContentControl.ContentTemplateSelector = new MyDataTemplateSelector();


No estoy al tanto de ninguna forma (no lúgubre) de hacer esto: se llama a DataTemplateSelector cuando WPF necesita seleccionar la plantilla, y esa es una decisión única en lo que respecta a WPF. (Puede evitarlo haciendo que WPF piense que el contenido ha cambiado, por ejemplo, configurando el contenido en nulo y luego de nuevo. Creo que funcionaría pero no lo he probado, pero esto es bastante feo!) Si hay una buena manera de hacer esto, yo también estaría interesado en saber!

Sin embargo, hay una forma alternativa de cambiar la forma en que se muestra el contenido que se actualiza en respuesta a los cambios en los datos, y eso es a través de activadores. Puede usar DataTriggers en su colección DataTemplate.Triggers para mostrar y ocultar elementos dependiendo de los datos de contenido. Para cambiar toda la pantalla, podría, por ejemplo, configurar dos representaciones en una cuadrícula y usar disparadores para controlar cuál es visible. Incluso podría convertir su plantilla de datos en ContentControl y utilizar un desencadenante para cambiar la plantilla de contenido. Por supuesto, esto depende de que los criterios para cambiar la plantilla sean propiedades vinculables, lo que puede no ser siempre el caso.

Aquí hay una breve discusión de los selectores frente a los desencadenantes , aunque en un contexto ligeramente diferente.