Silverlight:将自定义控件绑定到任意对象

时间:2010-05-27 20:50:15

标签: silverlight binding custom-controls

我打算编写一个分层的组织控制,类似于组织结构图。有几个组织结构图实现,但不太符合我的想法。

DataTemplate中的字段绑定到自定义对象似乎不起作用。

我开始使用通用的自定义控件,即

public class NodeBodyBlock : ContentControl
{
    public NodeBodyBlock()
    {
        this.DefaultStyleKey = typeof(NodeBodyBlock);
    }
}

generic.xaml中有一个简单的样式:

   <Style TargetType="org:NodeBodyBlock">
    <Setter Property="Width" Value="200" />
    <Setter Property="Height" Value="100" />
    <Setter Property="Background" Value="Lavender" />
    <Setter Property="FontSize" Value="11" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="org:NodeBodyBlock">
                <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" 
                        Background="{TemplateBinding Background}" CornerRadius="4" BorderBrush="Black" BorderThickness="1" >
                    <Grid>
                        <VisualStateManager/> ... clipped for brevity
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter Content="{TemplateBinding Content}"
                            HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我现在的计划是能够使用这个通用定义作为排序的基本定义,其定制版本用于显示不同类型的内容。

一个简单的例子是在具有以下样式的用户控件上使用它:

<Style TargetType="org:NodeBodyBlock" x:Key="TOCNode2">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Path=NodeTitle}"/>
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

和一个定义为

的实例
<org:NodeBodyBlock Style="{StaticResource TOCNode2}" x:Name="stTest" 
                       DataContext="{StaticResource DummyData}"  />

DummyData定义为

<toc:Node NodeNumber="mynum" NodeStatus="A" 
   NodeTitle="INLine Node Title!"    
   x:Key="DummyData"/>

在它后面有一个简单的C#类,其中每个字段都是公共属性。

运行应用程序时,虚拟数据值根本不会显示在GUI中。一个简单的测试,如

<TextBlock Text="{Binding NodeTitle}" DataContext="{StaticResource DummyData}"/>

工作正常。

关于我错过情节的任何想法?

更新:绑定到generic.xaml中定义中的datacontext工作正常,但ContentPresenter中的任何绑定都会丢失。

2 个答案:

答案 0 :(得分:0)

您的控件模板缺少ContentPresenter上的绑定,它应如下所示: -

                    <ContentPresenter Content="{TemplateBinding Content}"
                        ContentTemplate="{TemplateBinding ContentTemplate}"
                        HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />

答案 1 :(得分:0)

我最后以这个例子为基础:

http://10rem.net/blog/2010/02/05/creating-customized-usercontrols-deriving-from-contentcontrol-in-wpf-4

不太确定我错过了什么,但示例有效。