0

我有一个简单的 DataTemplateSelector 设置:

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null && item is ParameterViewModel)
        {
            ParameterViewModel paramItem = item as ParameterViewModel;

            if (paramItem.ControlInfo.Type == "slider")
            {
                return element.FindResource("sliderParam") as DataTemplate;
            }
            else if (paramItem.ControlInfo.Type == "button")
            {
                return element.FindResource("buttonParam") as DataTemplate;
            }
                            ...... etc

这一切都很好,我已将它添加到我的 XAML 中并且它按预期工作。

现在,我要做的是:如果满足条件,则在返回之前向 DataTemplate 添加一些额外的控件。我的第一次尝试是创建一个 StackPanel FrameworkElementFactory,并将 DataTemplate 的 VisualTree 以及我希望添加的额外控件添加到其中,然后返回一个 DataTemplate,并将 VisualTree 设置为 FrameWorkElementFactory。

例如

                FrameworkElementFactory spFactory = new FrameworkElementFactory(typeof(StackPanel));

                if (paramItem.ControlInfo.Type == "slider")
                {
                    spFactory.AppendChild((element.FindResource("sliderParam") as DataTemplate).VisualTree);
                }

  ...

                //add my extra controls 
                if(condition..)
                {
                    spFactory.AppendChild(extraControl);
                }

               return new DataTemplate { VisualTree = spFactory };

但是,由于 DataTemplate 是在 XAML 中定义的,因此 VisualTree 属性将始终返回 null。

如何向 DataTemplate 添加控件?

4

1 回答 1

0

尝试这个

...
if (paramItem.ControlInfo.Type == "slider")
{
   spFactory.AppendChild(FactoryFromResource("sliderParam"));
}
...

private FrameworkElementFactory FactoryFromResource(string resource)
{
    DataTemplate dataTemplate = FindResource(resource) as DataTemplate;
    FrameworkElementFactory factory = new FrameworkElementFactory(typeof(ContentControl));
    factory.SetValue(ContentControl.ContentTemplateProperty, dataTemplate);
    return factory;
}
于 2012-05-30T15:40:51.280 回答