2012-01-23 70 views
2

我使用典型的listbox + datatemplate视图在ObservableCollection中显示多个电影项目。 但是,我希望在同一页面能够快速将视图更改为我定义posterview(即只包含在wrappanel中的posterimages)。在运行时更改部分视图

xaml-page使用viewmodel作为datacontext。

有没有办法基本上用另一部分XAML内容替换? 在视图的代码隐藏中尽可能保留尽可能少的代码。

我见过WPF的例子,对于例如使用绑定到一个viewmodelproperty这是非常干净的, 为this article 这样的DataTrigger ......但Windows手机没有一个DataTriggers,是否正确?

我正在尝试使用MVVM-ish方法,因此需要在代码隐藏视图中尽可能少的代码。

所以我想改变这一点:

<ContentControl DataContext="{Binding CinemaShowsOverview }" Template="{StaticResource ListView}" /> 

要:

<ContentControl DataContext="{Binding CinemaShowsOverview }" Template="{StaticResource PosterView}" /> 

回答

4

带有DataTemplateSelector的DataTemplates将是解决此问题的方法。

基础数据模板选择:

public class DataTemplateSelector : ContentControl 
{ 
    public virtual DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     throw new NotImplementedException(); 
    } 

    protected override void OnContentChanged(object oldContent, object newContent) 
    { 
     base.OnContentChanged(oldContent, newContent); 

     ContentTemplate = SelectTemplate(newContent, this); 
    } 
} 

专用模板选择您CinemaShowsOverview

public class CinemaShowsTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate ListTemplate 
    { 
     get; 
     set; 
    } 

    public DataTemplate PosterTemplate 
    { 
     get; 
     set; 
    } 

    public DataTemplate DefaultTemplate 
    { 
     get; 
     set; 
    } 

    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     if (item == null) 
      return DefaultTemplate; 

     var viewModel = item as CinemaShowsOverview; 
     if (viewModel != null) 
      return viewModel.IsPoster ? PowerTemplate : ListTemplate; 
     else 
      return DefaultTemplate; 
    } 
} 

然后在XAML(可替换当前的ContentControl):

<assets:CinemaShowsTemplateSelector PosterTemplate="{StaticResource PosterView}" 
            ListTemplate="{StaticResource ListView}" 
            Content="{Binding CinemaShowsOverview}"> 
+0

谢谢!奇迹般有效! –

+0

也许DataTemplateSelector应该是一个抽象类,而SelectTemplate应该是抽象的? – Charlie

0

只要是迂腐,你提到的博客介绍类型的数据的模板,而不是datatriggers(如笔者类他们)。不,该功能在Silverlight for WP7中不可用。

您可以将您需要的模板作为视图模型中的字符串公开,即字符串为ListViewPosterView。然后通过提供模板的值转换器将您的Template属性绑定到此视图模型属性,该模板可通过应用程序Resources访问。

+0

PS第二部分的博客使用DataTriggers虽然:) –

+0

@Tim水坝啊......我的坏! – ColinE

+0

其实DataTemplates是一个非常好的主意。查看我的答案,了解如何利用它们。 –