UserControl的DataTemplateSelector

时间:2018-04-21 16:36:13

标签: uwp listbox user-controls datatemplate datatemplateselector

我有一个列表框,我想在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>

1 个答案:

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