通过绑定渲染非UIElement

时间:2009-12-18 20:08:40

标签: wpf binding uielement

如果我有一个派生自System.Windows.DispatcherObject的对象,但定义了ControlTemplate

public class A : System.Windows.DependencyObject
{
   public ControlTemplate ControlTemplate {get; set;}
}

的成员
public class B 
{
   public A NonUIElement {get; set;}
}

是否可以通过绑定(例如

)渲染此对象
<Border Name="Border">
<ContentPresenter Margin="5,0" Content="{Binding NonUIElement }"/>
</Border>

假设边框的DataContext设置为B的实例?

2 个答案:

答案 0 :(得分:3)

该对象将呈现,但不是我认为你希望的方式。 The Content的{​​{1}}设置为A的实例。然后WPF尝试弄清楚如何呈现此A的实例。它首先要求,此对象是ContentPresenter吗?在这种情况下,答案是否定的。接下来它会查找该类型的UIElement。在这种情况下,A类没有DataTemplate。所以它回到调用ToString()。因此,DataTemplate将显示包含文字“YourNamespace.A”的ContentPresenter

A碰巧有类型TextBlock的成员这一事实不会影响这种逻辑。对于WPF来说,这只是A恰好携带的一大块数据。当涉及控件并且ControlTemplate被分配给ControlTemplate属性时,仅WPF 使用 ControlTemplate

所以你需要为A提供Template(当然可以访问DataTemplate并使用它来呈现实例),或者创建一个名为ControlTemplate并应用它通过DataTemplate,或者来自ContentPresenter.ContentTemplate

答案 1 :(得分:0)

我终于得到了它;

<HierarchicalDataTemplate DataType="{x:Type vm:MapLayerModel}" ItemsSource="{Binding Path=Children, Mode=OneTime}">   
**<ContentControl Margin="5" Content="{Binding LayerRepresentation}" Template="{Binding LayerRepresentation.ControlTemplate}" Mode=OneTime/>**
</HierarchicalDataTemplate>

这是关于WPF模板及其内容控制模型的一个很好的个人课程。再次感谢itowlson。