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?
BorderBrush del Border Templates è sempre verde. –
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
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