2011-08-16 44 views
3

我想动态更改ItemTemplateLongListSelector。我通过将它绑定到我的ViewModel中的一个属性来完成此操作:LongListSelector更改项目模板

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

此操作为止。问题是,如果我更改ViewModel中模板的属性,那么LongListSelector不适用更改后的模板。我使用它的setter来更改属性,然后getter被依次调用,所以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