2011-12-07 28 views
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始終爲空,並且不顯示任何綁定錯誤。

想法?

+0

我懷疑關鍵「annotationTemplateSelector」而不是「AnnotationTemplateSelector」是一個錯字?你會得到一個例外,否則... – Jens

+0

是的,這是一個錯字。問題原來是在一些遺漏的細節。我現在發佈更新。 –

+0

是否應用了你的風格?選擇器是否定義在樣式的「上方」?您是否因爲任何原因設置了ItemTemplate,因爲當找到ItemTemplate時,選擇器將被忽略(可能爲零)。 – dowhilefor

回答

2

事實證明我錯過了ContentPresenter中的綁定。現在,我提供我的回答,希望它會阻止任何人對可能犯同樣的錯誤在今後的無奈:

<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}" 
               ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}" 
               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> 

我錯過了ContentTemplateSelector在ContentPresenter綁定,因此它顯然從未調用。

相關問題