Wpf 如何以编程方式将控件添加到XAML中定义的DataTemplate中?
我有一个简单的DataTemplateSelector设置: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 &
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;
}