DataTemplateSelector для UserControl

vixez спросил: 28 марта 2018 в 02:56 в: uwp

У меня есть Listbox, где я хочу загружать в различные типы UserControls в приложении UWP.

Причина, по которой мне нужны UserControls, - это то, что для каждого элемента, который будет показан, необходим код. в списке, поэтому простой DataTemplate не сокращает его.

Я получаю сообщение об ошибке в строке

<converters:HomeWidgetControlPicker>

в списке.

p>
The specified value cannot be assigned. The following type was expected: "DependencyObject".

Как я могу сделать загрузку UserControl? Я использовал этот метод в более старом приложении UWP и там он работал, но в моем новом проекте это не так.

Я не могу использовать x: DataType как все элементы, которые будут одного класса (HomeWidget) , но в зависимости от свойства Type HomeWidget выбран правильный 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 ответ

Есть решение
Sunteen Wu - MSFT ответил: 29 марта 2018 в 01:44

То, как вы используете DataTemplateSelector, должно быть неверным. В вашем фрагменте кода DataTemplateSelector размещается как корневой элемент DataTemplate, но на самом деле вы можете использовать DataTemplateSelector и устанавливать такие свойства, как ItemTemplateSelector, чтобы назначить его представлению данных. Подробнее см. В разделе "Примечания" класса DataTemplateSelector.

Базовый класс DataTemplateSelector не используется в качестве элемента объекта в XAML. Тем не менее, это обычный сценарий для получения пользовательского DataTemplateSelector, сопоставления префикса xmlns для пользовательского класса и его пространства имен / сборки, а затем ссылки на экземпляр пользовательского класса, как определено в блоке ресурсов в XAML. Это позволяет ссылаться на пользовательский класс селектора шаблона с помощью x: Key и использовать эту ссылку для установки значения свойств, таких как ItemTemplateSelector, в шаблонах XAML и визуальных состояниях.

Например,

<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>
vixez ответил: 31 марта 2018 в 03:23
Это сработало, спасибо!