我有一个列表框,我想在UWP应用程序中加载不同类型的UserControl。
我需要UserControls的原因是因为列表中显示的每个项目都需要代码隐藏,因此简单的DataTemplate不会删除它。
我在这行收到错误
<converters:HomeWidgetControlPicker>
在列表框中。
The specified value cannot be assigned. The following type was expected: "DependencyObject".
如何加载UserControl?我在一个较旧的UWP应用程序中使用了这种方法并且它有效,但在我的新项目中它并没有。
我不能将x:DataType用作同一个类(HomeWidget)的所有项,但是根据HomeWidget的Type属性,选择了正确的UserControl。
我制作了一个DataTemplateSelector:
public class HomeWidgetControlPicker : DataTemplateSelector
{
public DataTemplate Artist { get; set; }
public DataTemplate Release { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
if (item != null)
{
var result = (HomeWidget)item;
if (result.Type == "artist")
{
return Artist;
}
if (result.Type == "release")
{
return Release;
}
}
return null;
}
}
我有一个Listbox,目前只使用了类型(HomeWidgetControlPicker.Artist),但会有更多。
<ListBox x:Name="wrapGrid" ItemContainerStyle="{StaticResource WrapPanelBorderedItem}" ItemsSource="{x:Bind WidgetList}" Background="{x:Null}" ScrollViewer.VerticalScrollBarVisibility="Disabled" VerticalAlignment="Top" HorizontalAlignment="Center" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<userControls:WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<converters:HomeWidgetControlPicker>
<converters:HomeWidgetControlPicker.Artist>
<DataTemplate>
<homeItems:HomeArtist></homeItems:HomeArtist>
</DataTemplate>
</converters:HomeWidgetControlPicker.Artist>
</converters:HomeWidgetControlPicker>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 0 :(得分:1)
您使用DataTemplateSelector
的方式应该是错误的。在您的代码段中,DataTemplateSelector
被设置为DataTemplate
的根元素,但实际上,您可以使用DataTemplateSelector
并设置ItemTemplateSelector
等属性将其分配给数据视图。有关详细信息,请参阅DataTemplateSelector
课程的remarks section。
基础DataTemplateSelector类不用作XAML中的对象元素。但是,通常情况下派生自定义DataTemplateSelector,为自定义类及其名称空间/程序集映射xmlns前缀,然后引用XAML中Resources块中定义的自定义类的实例。这使得可以通过x:Key引用自定义模板选择器类,并使用该引用在XAML模板和可视状态中设置ItemTemplateSelector等属性的值。
例如:
<Page.Resources>
<DataTemplate x:Key="Artist" x:DataType="local:HomeWidget">
<Grid>
<local:UserControl1></local:UserControl1>
...
</Grid>
</DataTemplate>
<DataTemplate x:Key="Release" x:DataType="local:HomeWidget">
<Grid>
<local:UserControl2></local:UserControl2>
...
</Grid>
</DataTemplate>
<local:HomeWidgetControlPicker x:Key="HomeWidgetControlPicker" Artist="{StaticResource Artist}" Release="{StaticResource Release}">
</local:HomeWidgetControlPicker>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListBox x:Name="wrapGrid" ItemTemplateSelector="{StaticResource HomeWidgetControlPicker}" ItemsSource="{x:Bind WidgetList}"
...
</ListBox>
</Grid>