У меня проблемы с 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>
0
GermanSniper 19 Авг 2014 в 13:30
Если я изменю contentControl DataContext = "{StaticResource itemViewSource}" на Content = "{StaticResource itemViewSource}", я получу исключение: WinRT information: Failed to assign to property 'Windows.UI.Xaml.Controls.ContentControl.Content'
 – 
GermanSniper
19 Авг 2014 в 13:33

1 ответ

Лучший ответ

После изменения ContenControlComponente на:

    <ContentControl Grid.Row="2" Grid.ColumnSpan="2" Margin="0,20,0,0"
         Name="contentControl" 
         Content="{Binding SelectedItem, ElementName=itemListView}"
         ContentTemplateSelector="{StaticResource MyDataTemplateSelector}" />

Это работает.

0
GermanSniper 20 Авг 2014 в 11:30
Мы можем заставить работать селектор шаблонов? Я не могу прервать событие в методе SelectTemplatecCore.
 – 
Lance
12 Окт 2015 в 22:33