Silverlight: Binding a custom control to an arbitrary object

Posted by Ryan Bates on Stack Overflow See other posts from Stack Overflow or by Ryan Bates
Published on 2010-05-27T20:50:15Z Indexed on 2010/05/27 20:51 UTC
Read the original article Hit count: 246

I am planning on writing a hierarchical organizational control, similar to an org chart. Several org chart implementations are out there, but not quite fit what I have in mind.

Binding fields in a DataTemplate to a custom object does not seem to work.

I started with a generic, custom control, i.e.

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

It has a simple style in 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>

My plan now is to be able to use this common definition as a base definition of sorts, with customized version of it used to display different types of content.

A simple example would be to use this on a user control with the following 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>

and an instance defined as

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

The DummyData is defined as

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

With a simple C# class behind it, where each of the fields is a public property.

When running the app, the Dummy Data values simply do not show up in the GUI. A trivial test such as

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

works just fine.

Any ideas around where I am missing the plot?

© Stack Overflow or respective owner

Related posts about Silverlight

Related posts about binding