Я планирую написать иерархический организационный контроль, похожий на организационную схему. Существует несколько реализаций оргструктуры, но они не совсем соответствуют тому, что я имею в виду.
Привязка полей в 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
потеряна.