2
我正在開發一個自ListBox下降的自定義控件。作爲我的控件的一部分,我想提供一個默認的ItemTemplateSelector。不幸的是,我看不到它找到我的DataTemplateSelector。下面是代碼,用不相干的細節省略掉:在自定義控件樣式中應用DataTemplateSelector
public class AnnotationTemplateSelector : DataTemplateSelector
{
public DataTemplate BoxValuePairTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return BoxValuePairTemplate;
}
}
而XAML中...
<DataTemplate x:Key="BoxValuePairDataTemplate">
<Grid TextBlock.FontSize="9" Height="13" Width="{Binding Path=Width}" SnapsToDevicePixels="False">
... etc...
</Grid>
</DataTemplate>
的選擇:
<Annotations:AnnotationTemplateSelector BoxValuePairTemplate="{StaticResource BoxValuePairDataTemplate}"
x:Key="AnnotationTemplateSelector" />
風格:
<Style TargetType="{x:Type Annotations:BoxEditorSurface}">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="ItemTemplateSelector" Value="{StaticResource AnnotationTemplateSelector}"/>
... etc ...
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Canvas.Left" Value="{Binding Path=X, Mode=TwoWay}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Y, Mode=TwoWay}" />
<Setter Property="Padding" Value="0" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter x:Name="contentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
</Setter.Value>
</Setter>
</Style>
不幸的是,在模板應用之後,ItemTempl ateSelector始終爲空,並且不顯示任何綁定錯誤。
想法?
我懷疑關鍵「annotationTemplateSelector」而不是「AnnotationTemplateSelector」是一個錯字?你會得到一個例外,否則... – Jens
是的,這是一個錯字。問題原來是在一些遺漏的細節。我現在發佈更新。 –
是否應用了你的風格?選擇器是否定義在樣式的「上方」?您是否因爲任何原因設置了ItemTemplate,因爲當找到ItemTemplate時,選擇器將被忽略(可能爲零)。 – dowhilefor