Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何以编程方式将控件添加到XAML中定义的DataTemplate中?_Wpf_Datatemplate_Add - Fatal编程技术网

Wpf 如何以编程方式将控件添加到XAML中定义的DataTemplate中?

Wpf 如何以编程方式将控件添加到XAML中定义的DataTemplate中?,wpf,datatemplate,add,Wpf,Datatemplate,Add,我有一个简单的DataTemplateSelector设置: public override DataTemplate SelectTemplate(object item, DependencyObject container) { FrameworkElement element = container as FrameworkElement; if (element != null && item != null &

我有一个简单的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之前,向DataTemplate添加一些额外的控件。 我的第一次尝试是创建StackPanel FrameworkElementFactory,并将DataTemplate的VisualTree以及我希望添加的额外控件添加到其中,然后将VisualTree设置为FrameworkElementFactory的DataTemplate返回给FrameworkElementFactory

例如

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

如何向DataTemplate添加控件?

试试这个

...
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;
}

你为什么要这么做?我只能强烈劝阻你那样做。这听起来很有用,但实际上我认为你不想这样。否则,您可以始终使用Usercontrols或ContentControls来定义模板的某些部分,这些部分将再次使用不同的模板或模板选择器进行解析。否则,只需为所有不同的表示创建一个datatemplate,和/或使用触发器隐藏其中的某些部分。当我显示paramItem时,如果满足条件,我希望在弹出窗口中显示paramItem,以强制用户为其输入值。我唯一能看到这一点的地方是在选择datatemplate时。如果需要,在参数周围包装一个弹出窗口似乎是合乎逻辑的。在XAML中为每个参数创建完全相同的dataTemplate,只是将其包装在弹出窗口中似乎是不对的。@Dowhilef考虑到这一点,您还有其他建议吗?正如我所说,我为这些附加控件创建了dataTemplate,并添加了ContentControl,没有特殊绑定,只是另一个ContentTemplate。工作得很好。@do如果满足条件,我需要做的就是在弹出窗口中显示控件,我觉得必须有一个更好的解决方案,然后复制每个控件模板并在其周围放置一个标记。值得一提的是,指向的备注部分。OP询问如何将xaml中定义的数据模板添加到FrameworkElementFactory,我回答了。就我个人而言,我使用XAMLReader从字符串加载XAML。我不是在判断你的答案,它完全有效,但应该清楚的是,这在未来的版本中可能不受支持,而另一方面,这是不太可能的。
...
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;
}