C# Listbox ItemTemplate选择器不选择模板
我正在尝试在网格中的列表框上使用ItemTemplateSelector,该列表框是在不同的文件上创建的,稍后将由主窗口调用 这是我的DataTemplateSelector代码C# Listbox ItemTemplate选择器不选择模板,c#,wpf,visual-studio-2010,xaml,C#,Wpf,Visual Studio 2010,Xaml,我正在尝试在网格中的列表框上使用ItemTemplateSelector,该列表框是在不同的文件上创建的,稍后将由主窗口调用 这是我的DataTemplateSelector代码 public class TemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { F
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;
}
}
这是我的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>
但是,尽管绑定工作正常(非格式化对象列表显示在列表中),ItemTemplateSelector没有调用TemplateSelector方法。我在方法的开头放了一个断点,它从未被调用过
有人知道问题出在哪里吗?@Rachel是对的。您的
DataTemplateSelector
在加载时只被调用一次,而不用于INPC
更改
您可以根据需要使用ListBoxItemStyle
和DataTrigger
切换使用的模板
比如:
<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" />
Border模板边框的笔刷始终为绿色。感谢您的评论,尽管这不是问题所在。这只是我发布问题的方式,因为我不想发布确切的代码。再次感谢。让我编辑它,这样它就不会成为一种干扰。加载后,列表框
的项目资源
是否会更改?我认为templateSelector
不会响应PropertyChanged或CollectionChanged事件-当程序加载时,它们只会被评估一次!如果是这样的话,那我该怎么做?@user971602我知道你没有接受答案。有什么问题吗?我很好奇,因为某些原因,模板没有被正确拾取。我再次接受了这个答案,但我必须寻找一个解决办法。我以后再发。效果很好@locorecto,你有问题或bug吗?