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.