silverlight: как отобразить различные представления в списке в зависимости от типа объекта items - PullRequest
1 голос
/ 02 января 2011

Скажем, у меня есть два класса: AppleViewModel и OrangeViewModel.И у меня есть ObservableCollection<object> из AppleViewModel и OrangeViewModel.

. Есть также два соответствующих представления: AppleView и OrangeView.

Вapp.xaml, для них есть DataTemplates:

<Application.Resources>
    <DataTemplate x:Key="AppleTemplate">
        <local:AppleView/>
    </DataTemplate>
    <DataTemplate x:Key="OrangeTemplate">
        <local:OrangeView/>
    </DataTemplate>
</Application.Resources>

И конвертер на всякий случай:

public class MyContentConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value is AppleViewModel)
            return Application.Current.Resources["AppleTemplate"] as DataTemplate;
        else if (value is OrangeViewModel)
            return Application.Current.Resources["OrangeTemplate"] as DataTemplate;
        else return null;
    }
}

На него ссылаются:

<phone:PhoneApplicationPage.Resources>
    <local:MyContentConverter x:Key="cConverter"/>
</phone:PhoneApplicationPage.Resources>

И это<ListBox/>:

    <ListBox ItemsSource="{Binding Fruits}" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <ContentControl ContentTemplate="{Binding Converter={StaticResource cConverter}}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

Показывает только пустой экран.Как я могу это исправить, чтобы в списке отображались разные виды яблок и апельсинов?

1 Ответ

4 голосов
/ 02 января 2011

DataContext для ContentTemplate ContentControl фактически является содержимым ContentControl, а не его DataContext. Таким образом, проблема может заключаться в том, что ваши представления становятся пустыми как DataContext.

Попробуй вот так

<ListBox ItemsSource="{Binding Fruits}" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding}"
                            ContentTemplate="{Binding Converter={StaticResource cConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Обновление
Попробуйте добавить некоторую статическую информацию в AppleView и OrangeView и посмотреть, работает ли она

OrangeView

<StackPanel x:Name="LayoutRoot" Background="Orange" Orientation="Horizontal">
    <TextBlock Text="Orange View:"/>
    <TextBlock Text="{Binding Name}"/>
</StackPanel>

AppleView

<StackPanel x:Name="LayoutRoot" Background="Green" Orientation="Horizontal">
    <TextBlock Text="Apple View:"/>
    <TextBlock Text="{Binding Name}"/>
</StackPanel>

Кроме того, я загрузил здесь пример приложения, чтобы вы могли сравнить его с вашим:
http://www.mediafire.com/?dqy47c69zgcmcnv

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...