silverlight:如何根据项目对象类型在列表框中显示不同的视图?

silverlight:如何根据项目对象类型在列表框中显示不同的视图?,silverlight,data-binding,mvvm,windows-phone-7,Silverlight,Data Binding,Mvvm,Windows Phone 7,比如说,我有两个类:AppleViewModel和OrangeViewModel。我有一个可观察到的AppleViewModel和OrangeViewModel的集合 还有两个对应的视图:AppleView和OrangeView 在app.xaml中,有用于它们的数据模板: <Application.Resources> <DataTemplate x:Key="AppleTemplate"> <local:AppleView/>

比如说,我有两个类:AppleViewModel和OrangeViewModel。我有一个可观察到的AppleViewModel和OrangeViewModel的集合

还有两个对应的视图:AppleView和OrangeView

在app.xaml中,有用于它们的数据模板:

<Application.Resources>
    <DataTemplate x:Key="AppleTemplate">
        <local:AppleView/>
    </DataTemplate>
    <DataTemplate x:Key="OrangeTemplate">
        <local:OrangeView/>
    </DataTemplate>
</Application.Resources>
它被引用为:

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


它只显示空白屏幕。如何修复它,使列表框显示苹果和橙子的不同视图?

ContentControl的ContentTemplate的DataContext实际上是ContentControl的内容,而不是其DataContext。因此,问题可能是您的视图作为DataContext变为Null

像这样试试

<ListBox ItemsSource="{Binding Fruits}" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding}"
                            ContentTemplate="{Binding Converter={StaticResource cConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
更新 尝试向AppleView和OrangeView中添加一些静态信息,看看是否有效

橘子观

AppleView

此外,我在此处上传了我的示例应用程序,以便您可以将其与您的进行比较:
ContentControl的ContentTemplate的DataContext实际上是ContentControl的内容,而不是其DataContext。因此,问题可能是您的视图作为DataContext变为Null

像这样试试

<ListBox ItemsSource="{Binding Fruits}" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding}"
                            ContentTemplate="{Binding Converter={StaticResource cConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
更新 尝试向AppleView和OrangeView中添加一些静态信息,看看是否有效

橘子观

AppleView

此外,我在此处上传了我的示例应用程序,以便您可以将其与您的进行比较:

@Mikhail Orlov:那么你就不会再看到一个空白屏幕了?在这种情况下,我认为DataContext就是问题所在。我更新了我的答案,还上传了我的示例应用程序,这样你们就可以将它和你们的进行比较了。出于某种原因,重新启动计算机后,添加内容={Binding}会起作用。模拟器或工具中应该有一些bug。非常感谢您的时间和帮助!米哈伊尔·奥尔洛夫:你能帮我解决这个问题吗?这样你就不会再得到一个空白屏幕了?在这种情况下,我认为DataContext就是问题所在。我更新了我的答案,还上传了我的示例应用程序,这样你们就可以将它和你们的进行比较了。出于某种原因,重新启动计算机后,添加内容={Binding}会起作用。模拟器或工具中应该有一些bug。非常感谢您的时间和帮助!你能帮我认识到这是一篇老文章,但是silverlight 5现在有隐式数据模板。认识到这是一篇老文章,但是silverlight 5现在有隐式数据模板
<ListBox ItemsSource="{Binding Fruits}" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding}"
                            ContentTemplate="{Binding Converter={StaticResource cConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
<StackPanel x:Name="LayoutRoot" Background="Orange" Orientation="Horizontal">
    <TextBlock Text="Orange View:"/>
    <TextBlock Text="{Binding Name}"/>
</StackPanel>
<StackPanel x:Name="LayoutRoot" Background="Green" Orientation="Horizontal">
    <TextBlock Text="Apple View:"/>
    <TextBlock Text="{Binding Name}"/>
</StackPanel>