我有一个WPF列表框,其中包含一个名为JUC的用户控件。
这很有效,因为我对WPF很新,这已经非常令人印象深刻了。我现在要做的是根据绑定属性在列表中使用不同的用户控件。
这可能吗?如果没有,我还应该如何做到这一点?
我正在使用列表,因为我想允许用户控件的拖放顺序,并且会有一个可变数字,所以似乎有意义 - 欢迎使用其他方法。
<ListBox x:Name="peopleListBox"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ItemContainerStyle="{StaticResource ListBoxItemStretch}"
Foreground="Transparent"
BorderBrush="Transparent"
Background="Transparent"
Grid.ColumnSpan="2" SelectionChanged="peopleListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<my:JUC Margin="4"></my:JUC>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 0 :(得分:7)
您可以使用DataTemplateSelector,在SelectTemplate()方法中,您可以检查哪个DataTemplate用于当前传入的项目:
在XAML中:
<!-- define templates in resources
ChartDataTemplate is a ChartDataTemplate.xaml, the same for other
-->
<UserControl.Resources>
<DataTemplate x:Key="ChartDataTemplate">
<views:LineChartView />
</DataTemplate>
<DataTemplate x:Key="GridDataTemplate">
<views:PieChartView />
</DataTemplate>
</UserControl.Resources>
<!-- ListView Itemtemplate should point to template selector -->
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentPresenter
ContentTemplateSelector = "{StaticResource MyTemplateSelector}">
在代码背后:
private sealed class MyTemplateSelector: DataTemplateSelector
{
public override DataTemplate SelectTemplate(
object item,
DependencyObject container)
{
// 1. case item to your object which is bound to each ListView item
// 2. based on object type/state return correct DataTemplate
// as this.Resources["ChartDataTemplate"] or
// this.Resources["GridDataTemplate"]
}
}