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

时间:2011-01-02 07:00:54

标签: silverlight data-binding mvvm windows-phone-7

说,我有两个课程:AppleViewModelOrangeViewModel。我有ObservableCollection<object>AppleViewModelOrangeViewModel个。

还有两个相应的观点:AppleViewOrangeView

在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 个答案:

答案 0 :(得分:4)

ContentControl的ContentTemplate的DataContext实际上是ContentControl的内容,而不是其DataContext。所以问题可能是你的Views正在以DataContext的形式获得Null。

尝试这样

<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