2011-08-16 11 views
3

LongListSelectorItemTemplateを動的に変更したいと思います。私はこれをViewModelのプロパティにバインドすることで行います。LongListSelector change ItemTemplate

<toolkit:LongListSelector ItemTemplate="{Binding ItemTemplate}" ItemsSource="{Binding Items}" /> 

これまでのところこれまでの動作です。問題は、ViewModelでテンプレートのプロパティを変更した場合、LongListSelectorは変更されたテンプレートを適用しないということです。

私はデバッガを見ましたが、私はsetterを使ってプロパティを変更するたびにゲッターが呼び出されますので、LongListSelectorは新しいテンプレートを読み込みますが、それは適用されません。

これはバグですか、またはバインドによってItemTemplateを変更できませんか?

+0

あなたは明確にもらえますか?条件付きテンプレートを必要とする場合は、しばしば 'DataTemplateSelector'が良い選択です。 –

+0

silverlightには 'DataTemplateSelector'はありませんが、回避策がありますが、私はそれらが好きではありません... – thumbmunkeys

答えて

3

LongListSelectorは、そのItemTemplateへの変更を無視します。 LongListSelectorでたDependencyPropertyの定義は次のようになります。

public static readonly DependencyProperty ItemsTemplateProperty = 
     DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), 
            typeof(LongListSelector), 
            new PropertyMetadata(null)); 

あなたはそれが変化に気づくしたい場合は、ソースを取得し、このようにそれを再構築することができます:あなたがこれを必要とする理由

public static readonly DependencyProperty ItemsTemplateProperty = 
     DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), 
            typeof(LongListSelector), 
            new PropertyMetadata(null, 
                  OnItemsTemplateChanged)); 

    private static void OnItemsTemplateChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     ((LongListSelector)obj).OnItemsTemplateChanged(); 
    } 

    private void OnItemsTemplateChanged() 
    { 
     _flattenedItems = null; 
     if (_isLoaded) 
     { 
      EnsureData(); 
     } 
    } 
+0

優秀、ありがとう! – thumbmunkeys

+1

これは2011年8月のツールキットで修正されているようです – thumbmunkeys