es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Selector de plantilla de datos WPF basado en tipos genéricos

He visto muchos ejemplos de cómo usar Data Template Selector para mostrar controles diferentes según el x:TargetType. Quiero crear un control de elementos que muestre un RadioButton, TextBox o TextBlock según el tipo de clase.
Mi clase podría ser así:

public class MyExample<t>
{
   public string Name {get;set;}
   public Type Type => typeof(T);
   public T Value {get;set;}
}

Sé que el Xaml no puede reconocer los genéricos y no quiero crear una extensión de marcado para admitir genéricos, quiero mantenerlo simple. No quiero crear una clase concreta para cada tipo.
Sé que puedo usar un Data Trigger para establecer la plantilla de contenido según una propiedad (por ejemplo, el nombre de tipo o Type Type), pero creo que debería haber una forma más fácil de usar un Data Template Selector. ¿Puedo usar el TargetType en la propiedad Type en lugar del tipo de clase?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puede utilizar la propiedad TargetType del DataTemplateSelector para seleccionar de forma dinámica la plantilla adecuada basada en la propiedad Type de su clase MyExample. Aquí tienes un ejemplo de implementación de un DataTemplateSelector:

    public class MyExampleTemplateSelector : DataTemplateSelector
    {
        public DataTemplate RadioButtonTemplate { get; set; }
        public DataTemplate TextBoxTemplate { get; set; }
        public DataTemplate TextBlockTemplate { get; set; }
    
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            MyExample<object> example = item as MyExample<object>;
            if (example == null)
            {
                return null;
            }
    
            Type type = example.Type;
    
            if (type == typeof(bool))
            {
                return RadioButtonTemplate;
            }
            else if (type == typeof(string))
            {
                return TextBoxTemplate;
            }
            else
            {
                return TextBlockTemplate;
            }
        }
    }
    

    En este ejemplo, el método SelectTemplate verifica la propiedad Type del objeto MyExample y devuelve la DataTemplate adecuada según el tipo.
    Puede definir las plantillas para los controles de botón de radio, cuadro de texto y bloque de texto en su XAML y hacer referencia a ellas en el DataTemplateSelector.
    Ten en cuenta que en esta implementación asumí que el tipo solo podía ser booleano o una cadena, pero puedes modificarlo según tus requisitos.

Comments are closed.