我知道这是一种变通方法,但我在code project上发布了一个提示(
http://www.codeproject.com/Tips/808808/Create-Data-and-Control-Templates-using-Delegates),它允许您使用委托创建数据模板。
例如:
TemplateGenerator.CreateDataTemplate(() => new TextBox());
这将足以创建一个数据模板,以创建一个新的文本框。如果你想要一个绑定,它可以像这样编写:
TemplateGenerator.CreateDataTemplate
(
() =>
{
var result = new TextBox();
result.SetBinding(TextBox.TextProperty, "PathForTheBinding");
return result;
}
);
模板生成器的代码如下:
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();
}
}
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;
}
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;
}
}
它还有一个用于ControlTemplates的方法。
DataTemplate.VisualTree
方法仍然在WPF内部用于以编程方式创建模板时,很难称替代方法为弃用方法。 - caesay