2012-01-23 11 views
2

ObservableCollectionには、典型的なリストボックス+データテンプレートビューを使用していくつかのムービーアイテムが表示されます。 しかし、同じページで、私がポスターを定義するもの(つまり、ラッパーパネルのポスト画像のみ)にビューをすばやく変更したいと考えています。ランタイム時にビューの一部を変更する

xaml-pageは、datacontextとしてviewmodelを使用します。

基本的にXAMLコンテンツの一部を別のものに置き換える方法はありますか? そして、ビューのコードビハインドにできるだけ少ないコードを残してください。

私は例えば などthis article として、とてもきれいですviewmodelpropertyにバインドDataTriggerを使用することをWPFの例を見てきました...しかし、Windowsの携帯電話は正しい、DataTriggersを持っていませんか?

私はMVVM-ishのアプローチに取り掛かっています。そのため、ビューのコードビハインドで可能な限り小さなコードが必要です。

だから私は、この変更する:あなたが言及ブログは著者クラスそれらとして入力されたデータ・テンプレート、ないdatatriggersを(説明、ただ知識をひけらかすこと

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

答えて

4

DataTemplateSelectorを持つDataTemplatesは、この問題を回避する方法です。

基本データ・テンプレートセレクタ:XAMLでのご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; 
    } 
} 

そして用

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); 
    } 
} 

専門テンプレートセレクタ(現在ContentControlを置き換える):

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

ありがとう!魅力的な作品! –

+0

DataTemplateSelectorは抽象クラスであり、SelectTemplateは抽象クラスである必要がありますか? – Charlie

0

:へ

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

を)。いいえ、この機能はSilverlight for WP7では使用できません。

ビューモデル内の文字列として必要なテンプレート、つまりListViewまたはPosterViewのいずれかの文字列を公開することができます。 Templateプロパティをこのビューモデルプロパティにバインドするには、アプリケーションを介してアクセスできるテンプレートを提供する値コンバータResourcesを使用します。

+0

PS第二部しかし、ブログのDataTriggersを使用して:) –

+0

@ティムダムズああ...私の悪い! – ColinE

+0

実際には、DataTemplatesは本当に良いアイデアです。それらを活用する方法については、私の答えを参照してください。 –

関連する問題