2013-04-25 6 views
8

後でMainWindowによって呼び出される別のファイルで作成しているグリッド内のリストボックスでItemTemplateSelectorを使用しようとしています。ここで リストボックスItemTemplateセレクタがテンプレートを選択しない

は細かい結合作品は(非フォーマットされたオブジェクトのリストが一覧に表示されますが、ここでは私のXAML

<Grid x:Class="NS.Views.ListView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:c="clr-namespace:NS.Commons" 
    DataContext="{Binding}"> 
<Grid.Resources> 
    <c:myConverter x:Key="converter" /> 
    <c:TemplateSelector x:Key="borderSelector" /> 
    <DataTemplate x:Key="greenItemTemplate"> 
     <Border BorderThickness="3" BorderBrush="Green"> 
      <StackPanel HorizontalAlignment="Stretch"> 
       <TextBlock Text="{Binding Path=GroupName}"/> 
       <TextBlock Text="{Binding Path=myType}"/> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
      <DataTemplate x:Key="redItemTemplate"> 
     <Border BorderThickness="3" BorderBrush="Red"> 
      <StackPanel HorizontalAlignment="Stretch"> 
       <TextBlock Text="{Binding Path=GroupName}"/> 
       <TextBlock Text="{Binding Path=myType}"/> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
    <DataTemplate x:Key="yellowItemTemplate"> 
     <Border BorderThickness="3" BorderBrush="Yellow"> 
      <StackPanel HorizontalAlignment="Stretch"> 
       <TextBlock Text="{Binding Path=GroupName}"/> 
       <TextBlock Text="{Binding Path=myType}"/> 
      </StackPanel> 
     </Border> 
    </DataTemplate> 
</Grid.Resources> 

<ListBox ItemsSource="{Binding myCollectionOfMyClassObjects}" 
     Name="listBox1" 
     HorizontalContentAlignment="Stretch" 
     ItemTemplateSelector="{StaticResource borderSelector}" 
     > 
</ListBox> 

が、しかしある私のDataTemplateSelectorコード

public class TemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     FrameworkElement element = container as FrameworkElement; 
     if (element != null && item != null && item is myClass) 
     { 
      myClass agg = item as myClass; 
      if(agg.myType == a) 
      { 
       return element.FindResource("greenItemTemplate") as DataTemplate; 
      } 
      else if (agg.myType == b) 
      { 
       return element.FindResource("yellowItemTemplate") as DataTemplate; 
      } 
      else if (agg.myType == c) 
      { 
       return element.FindResource("redItemTemplate") as DataTemplate; 
      } 
     } 

     return null; 
    } 
} 

です)、ItemTemplateSelectorはTemplateSelectorメソッドを呼び出していません。私はメソッドの始めにブレークポイントを置いて、決して呼び出されません。

問題の原因を知っている人はいますか?

+2

BorderBrushあなたが必要と何のために何ができるか

DataTriggerTemplate

何かのように使用する切り替えでListBoxItemStyleを使用しています常にグリーンです。 –

+0

これは問題ではありませんが、コメントいただきありがとうございます。私は正確なコードを投稿したくないので、質問を投稿したのと同じでした。再度、感謝します。それを編集して気を散らすことはありません。 – locorecto

+2

'ListBox'の' ItemsSource'は読み込まれた後に変更されますか?私は 'TemplateSelectors'がPropertyChangedイベントやCollectionChangedイベントに反応しないと思っています - プログラムロード時に一度だけ評価されます。 – Rachel

答えて

7

@Rachelが正しいです。 DataTemplateSelectorはロード時に一度だけ呼び出され、INPCの変更は呼び出されません。

<ControlTemplate x:Key="greenItemTemplate"> 
    <Border BorderBrush="Green" 
      BorderThickness="3"> 
    <StackPanel HorizontalAlignment="Stretch"> 
     <TextBlock Text="{Binding Path=GroupName}" /> 
     <TextBlock Text="{Binding Path=myType}" /> 
    </StackPanel> 
    </Border> 
</ControlTemplate> 
<ControlTemplate x:Key="redItemTemplate"> 
    <Border BorderBrush="Red" 
      BorderThickness="3"> 
    <StackPanel HorizontalAlignment="Stretch"> 
     <TextBlock Text="{Binding Path=GroupName}" /> 
     <TextBlock Text="{Binding Path=myType}" /> 
    </StackPanel> 
    </Border> 
</ControlTemplate> 
<ControlTemplate x:Key="yellowItemTemplate"> 
    <Border BorderBrush="Yellow" 
      BorderThickness="3"> 
    <StackPanel HorizontalAlignment="Stretch"> 
     <TextBlock Text="{Binding Path=GroupName}" /> 
     <TextBlock Text="{Binding Path=myType}" /> 
    </StackPanel> 
    </Border> 
</ControlTemplate> 
<Style x:Key="MyListBoxItemStyle" 
     TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Template" 
      Value="{DynamicResource greenItemTemplate}" /> 
    <Style.Triggers> 
    <DataTrigger Binding="{Binding myType}" 
        Value="c"> 
     <Setter Property="Template" 
       Value="{DynamicResource redItemTemplate}" /> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding myType}" 
        Value="b"> 
     <Setter Property="Template" 
       Value="{DynamicResource yellowItemTemplate}" /> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> 

と使用方法:お使いのテンプレートのボーダーの

<ListBox ItemContainerStyle="{StaticResource MyListBoxItemStyle}" 
     ItemsSource="{Binding myCollectionOfMyClassObjects}" 
     Name="listBox1" 
     HorizontalContentAlignment="Stretch" /> 
+1

このソリューションは素晴らしいです。ありがとうございました。 – locorecto

+1

あなたの歓迎:) – Viv

+1

@ user971602私はあなたが答えを受け入れていないのを見ます。それに問題はありますか?好奇心が強い – Viv

関連する問題