2011-12-07 8 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は常にnullであり、バインディングエラーは表示されません。

アイデア?

+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> 

私はのContentPresenterにバインドContentTemplateSelectorを欠けていたので、それは明らかに呼び出されていませんでした。

関連する問題