Silverlight: привязка пользовательского элемента управления к произвольному объекту - PullRequest
2 голосов
/ 28 мая 2010

Я планирую написать иерархический организационный контроль, похожий на организационную схему. Существует несколько реализаций оргструктуры, но они не совсем соответствуют тому, что я имею в виду.

Привязка полей в 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 #, где каждое из полей является публичной собственностью.

При запуске приложения значения фиктивных данных просто не отображаются в графическом интерфейсе. Тривиальный тест, такой как

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

работает просто отлично.

Есть идеи, где мне не хватает сюжета?

Обновление: привязка к текстовому тексту в определении в generic.xaml работает нормально, но любая привязка в ContentPresenter потеряна.

Ответы [ 2 ]

0 голосов
/ 30 мая 2010

Я только что использовал этот пример в качестве базы:

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

Не совсем уверен, что я пропустил, но пример работает.

0 голосов
/ 28 мая 2010

В вашем шаблоне управления отсутствует привязка на ContentPresenter, она должна выглядеть следующим образом: -

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