【问题标题】:silverlight: how to display different views in listbox based on items object type?silverlight:如何根据项目对象类型在列表框中显示不同的视图?
【发布时间】:2011-06-02 10:13:32
【问题描述】:

比如说,我有两个类:AppleViewModelOrangeViewModel。我有AppleViewModelOrangeViewModel 中的ObservableCollection<object>

还有两个对应的视图: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>

这是&lt;ListBox/&gt;

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

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

【问题讨论】:

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


【解决方案1】:

ContentControl 的 ContentTemplate 的 DataContext 实际上是 ContentControl 的内容,而不是它的 DataContext。所以问题可能是您的视图将 Null 作为 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

【讨论】:

  • @Mikhail Orlov:所以你不再只是黑屏了?在那种情况下,我认为 DataContext 是问题所在。我稍微更新了我的答案并上传了我的示例应用程序,以便您可以将其与您的比较
  • 由于某种原因,重新启动计算机后添加Content="{Binding}" 有效。模拟器或工具中应该有一些错误。非常感谢您的宝贵时间和帮助!
  • 你能帮我解决这个问题吗stackoverflow.com/questions/22578128/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多