У меня проблемы с ContentTemplateSelector в приложении winrt для Windows 8. Слева я могу выбрать элемент, а в центральной области я хочу отобразить его содержимое. Но типы контента разные. Поэтому я решил использовать DataTemplateSelector. Но это не сработает.
Я думаю, что проблема в какой-то неправильной привязке, потому что объект элемента SelectTemplateCore Methode всегда имеет значение NULL.
Классы данных:
public class DataItem {
public DataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content) {
this.UniqueId = uniqueId;
this.Title = title;
this.Subtitle = subtitle;
this.Description = description;
this.ImagePath = imagePath;
this.Content = content;
}
public string UniqueId { get; set; }
public string Title { get; set; }
public string Subtitle { get; set; }
public string Description { get; set; }
public string ImagePath { get; set; }
public string Content { get; set; }
public override string ToString() {
return this.Title;
}
}
public class TextDataItem : DataItem {
public TextDataItem(string p1, string p2, string p3, string p4, string p5, string p6) : base (p1, p2, p3, p4, p5, p6) {
}
}
public class ImageDataItem : DataItem {
public ImageDataItem(string p1, string p2, string p3, string p4, string p5, string p6): base(p1, p2, p3, p4, p5, p6) {
}
}
DataTemplateSelector класс:
public class MyDataTemplateSelector : DataTemplateSelector {
public DataTemplate TextTemplate { get; set; }
public DataTemplate ImageTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) {
if (item == null) {
return null;
}
if (item is TextDataItem)
return TextTemplate;
if (item is ImageDataItem)
return ImageTemplate;
return base.SelectTemplateCore(item, container);
}
}
Код XAML:
<Page.Resources>
<CollectionViewSource
x:Name="itemsViewSource"
Source="{Binding Items}"
d:Source="{Binding Groups[0].Items}"/>
<CollectionViewSource
x:Name="itemViewSource"
Source="{Binding Items}"
d:Source="{Binding SelectedItem, ElementName=itemListView}" />
<DataTemplate x:Key="TextDataTemplate">
<Grid HorizontalAlignment="Right" Width="400" Height="280">
<StackPanel>
<TextBlock Text="12345" Margin="15,0,15,20"/>
<TextBlock Text="{Binding Content}" Margin="15,0,15,0">
</StackPanel>
</Grid>
</DataTemplate>
<DataTemplate x:Key="ImageDataTemplate">
<Grid HorizontalAlignment="Left" Width="400" Height="280">
<StackPanel VerticalAlignment="Bottom">
<Image Source="{Binding Content}" Stretch="UniformToFill"/>
</StackPanel>
</Grid>
</DataTemplate>
<data:MyDataTemplateSelector x:Key="MyDataTemplateSelector"
TextTemplate="{StaticResource TextDataTemplate}"
ImageTemplate="{StaticResource ImageDataTemplate}">
</data:MyDataTemplateSelector>
</Page.Resources>
Область содержимого:
<ScrollViewer
x:Name="itemDetail"
DataContext="{StaticResource itemViewSource}">
<Grid x:Name="itemDetailGrid" Margin="0,60,0,50" >
<Grid.RowDefinitions>
<RowDefinition Height="75"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ContentControl Grid.Row="2" Grid.ColumnSpan="2" Margin="0,20,0,0"
Name="contentControl"
DataContext="{StaticResource itemViewSource}"
ContentTemplateSelector="{StaticResource MyDataTemplateSelector}" />
</Grid>
</ScrollViewer>
1 ответ
После изменения ContenControlComponente на:
<ContentControl Grid.Row="2" Grid.ColumnSpan="2" Margin="0,20,0,0"
Name="contentControl"
Content="{Binding SelectedItem, ElementName=itemListView}"
ContentTemplateSelector="{StaticResource MyDataTemplateSelector}" />
Это работает.
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.
WinRT information: Failed to assign to property 'Windows.UI.Xaml.Controls.ContentControl.Content'