2013-04-25 8 views
8

Sto cercando di utilizzare un ItemTemplateSelector su una casella di riepilogo all'interno di una griglia che sto creando su un file diverso per essere successivamente chiamato dalla finestra principale.Listbox Il selettore ItemTemplate non seleziona un modello

Ecco il mio codice 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; 
    } 
} 

Ecco il mio 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> 

Tuttavia, anche se i lavori vincolanti fini (l'elenco degli oggetti non formattato viene visualizzato nell'elenco), ItemTemplateSelector non chiama i metodi TemplateSelector. Metto un punto di interruzione all'inizio dei metodi e non viene mai chiamato.

Qualcuno sa quale potrebbe essere il problema?

+2

BorderBrush del Border Templates è sempre verde. –

+0

Grazie per il commento, anche se questo non è il problema. Era solo il modo in cui ho postato la domanda poiché non volevo pubblicare il codice esatto. Grazie ancora. Lascia che lo modifichi in modo che non diventi una distrazione. – locorecto

+2

Il tuo 'ItemsSource' di' ListBox' cambia dopo il caricamento? Non penso che 'TemplateSelectors' risponda agli eventi PropertyChanged o CollectionChanged - Sono appena valutati una volta quando il programma carica – Rachel

risposta

7

@Rachel ha ragione. Il tuo DataTemplateSelector viene richiamato una sola volta al caricamento più o meno e non per le modifiche INPC.

Che cosa si può fare per quello che avete bisogno è usare un ListBoxItemStyle con DataTrigger commutazione del Template utilizzato

qualcosa di simile:

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

e il loro utilizzo:

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

Questa soluzione funziona alla grande. Grazie per il tempo. – locorecto

+1

il tuo benvenuto :) – Viv

+1

@ user971602 Vedo che hai rifiutato la risposta. c'è un problema con esso? Sono curioso – Viv

Problemi correlati