visual studio returns remarks c# dynamic datatemplate code-behind

c# - studio - Crear DataTemplate en el código detrás



summary c# visual studio (3)

Aunque el método de Archedius funciona, oficialmente está en desuso y, en su lugar, la forma recomendada de crear una plantilla es cargar XAML desde una cadena o un flujo de memoria usando el método Load de la clase XamlReader como este ...

public DataTemplate Create(Type type) { StringReader stringReader = new StringReader( @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""> <" + type.Name + @" Text=""{Binding " + ShowColumn + @"}""/> </DataTemplate>"); XmlReader xmlReader = XmlReader.Create(stringReader); return XamlReader.Load(xmlReader) as DataTemplate; }

Línea oficial tomada de msdn: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelementfactory.aspx

Ejemplo de código de la publicación de Fredrik Hedblad aquí: Problemas con XamlReader generando DataTemplate

¿Cómo agrego controles a las placas de datos programáticamente?

Por ejemplo. A continuación he creado TextBlock y DataTemplate.

TextBlock text = new TextBlock(); DataTemplate template = new DataTemplate();

Ahora necesito agregar TextBlock a DataTemplate. ¿Cómo lograr esto?

Sé que hay otras formas de agregar una plantilla de datos en el código detrás 1. cree una plantilla de datos en XAML y cárguela en el código detrás 2. cree y agregue usando XamlParser

Pero necesito hacerlo de la manera que mostraba en el ejemplo.

Necesito ayuda.


Primero tienes que declarar una DataTemplate:

DataTemplate template = new DataTemplate { DataType = typeof(< Type of the object the template refers>) };

Luego declara un panel de diseño como StackPanel de esta manera

FrameworkElementFactory stackPanelFactory = new FrameworkElementFactory(typeof(StackPanel)); stackPanelFactory.SetValue(StackPanel.OrientationProperty, Orientation.Vertical);

y finalmente adjuntar la pieza TextBlock en él:

FrameworkElementFactory title = new FrameworkElementFactory(typeof(TextBlock)); title.SetBinding(TextBlock.TextProperty, new Binding("< name of your binding >")); stackPanelFactory.AppendChild(title);

Para mostrar el StackPanel creado de esta manera, debe adjuntarlo a VisualTree:

template.VisualTree = stackPanelFactory;

¡Espero eso ayude! :)


Sé que es una solución, pero publiqué una sugerencia en el proyecto de código ( http://www.codeproject.com/Tips/808808/Create-Data-and-Control-Templates-using-Delegates ) que te permite crear una plantilla de datos utilizando un delegado. Por ejemplo:

TemplateGenerator.CreateDataTemplate(() => new TextBox());

Esto será suficiente para crear una placa de datos que cree un nuevo cuadro de texto. Si quieres un enlace también, podría escribirse como:

TemplateGenerator.CreateDataTemplate ( () => { var result = new TextBox(); result.SetBinding(TextBox.TextProperty, "PathForTheBinding"); return result; } );

El código del TemplateGenerator es el siguiente:

/// <summary> /// Class that helps the creation of control and data templates by using delegates. /// </summary> public static class TemplateGenerator { private sealed class _TemplateGeneratorControl: ContentControl { internal static readonly DependencyProperty FactoryProperty = DependencyProperty.Register("Factory", typeof(Func<object>), typeof(_TemplateGeneratorControl), new PropertyMetadata(null, _FactoryChanged)); private static void _FactoryChanged(DependencyObject instance, DependencyPropertyChangedEventArgs args) { var control = (_TemplateGeneratorControl)instance; var factory = (Func<object>)args.NewValue; control.Content = factory(); } } /// <summary> /// Creates a data-template that uses the given delegate to create new instances. /// </summary> public static DataTemplate CreateDataTemplate(Func<object> factory) { if (factory == null) throw new ArgumentNullException("factory"); var frameworkElementFactory = new FrameworkElementFactory(typeof(_TemplateGeneratorControl)); frameworkElementFactory.SetValue(_TemplateGeneratorControl.FactoryProperty, factory); var dataTemplate = new DataTemplate(typeof(DependencyObject)); dataTemplate.VisualTree = frameworkElementFactory; return dataTemplate; } /// <summary> /// Creates a control-template that uses the given delegate to create new instances. /// </summary> public static ControlTemplate CreateControlTemplate(Type controlType, Func<object> factory) { if (controlType == null) throw new ArgumentNullException("controlType"); if (factory == null) throw new ArgumentNullException("factory"); var frameworkElementFactory = new FrameworkElementFactory(typeof(_TemplateGeneratorControl)); frameworkElementFactory.SetValue(_TemplateGeneratorControl.FactoryProperty, factory); var controlTemplate = new ControlTemplate(controlType); controlTemplate.VisualTree = frameworkElementFactory; return controlTemplate; } }

Y tiene un método para ControlTemplates también.