У меня есть 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>
То, как вы используете
DataTemplateSelector
, должно быть неверным. В вашем фрагменте кодаDataTemplateSelector
размещается как корневой элементDataTemplate
, но на самом деле вы можете использоватьDataTemplateSelector
и устанавливать такие свойства, какItemTemplateSelector
, чтобы назначить его представлению данных. Подробнее см. В разделе "Примечания" классаDataTemplateSelector
.Например,