2011-03-08 30 views
2

我正在創建一些附加屬性,其中之一是DataTemplate。在DataTemplate中應該有,我已經在它創造了限定,使得這一切的XAML聲明看起來像一個FrameworkElement的:DataContext更改並不總是導致從DataTemplate.LoadContent類的綁定更新

<SomeControl m:ItemsSource="{Binding Source}"> 
    <m:MyTemplate> 
    <DataTemplate> 
     <m:MyClass SomeDependency="{Binding Path}"/> 
    </DataTemplate> 
    </m:MyTemplate> 
</SomeControl> 

在爲MyTemplateProperty變化回調的代碼,它的來源,並呼籲每一個項目遍歷DataTemplate上的LoadContent()。然後,它設置在DataContext從源通過LoadContent()返回到項目類:

private static void MyTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var items = (d as SomeControl).GetValue(ItemsSourceProperty) as IList; 
    var template = e.NewValue as DataTemplate; 
    foreach(var item in items) 
    { 
    var myClass = template.LoadContent() as MyClass; 
    myClass.DataContext = item; 
    } 
} 

這裏奇怪的是,以這種方式創建的MyClass一審獲取綁定更新(SomeDependencyProperty更新與價值那就是ItemsSource中的項目),但其餘的實例都沒有更新。

我覈實,這應該正確地創建MyClass的自己,而不是LoadContent調用和設置使用BindingOperation.SetBinding像綁定工作:

foreach(var item in items) 
{ 
    var myClass = new MyClass(); 
    BindingOperations.SetBinding(myClass, MyClass.SomeDependencyProperty, new Binding("Path"); 
    myClass.DataContext = item; 
} 

有誰知道爲什麼LoadContent通話似乎產生對象DataContext更改時不都更新其綁定? LoadContent調用與完全自己創建對象有什麼不同?

回答

2

一位同事指出,沒有任何東西是堅持MyClass的實例。爲參考這些實例添加一種方法解決了我所看到的問題。這並不能解釋爲什麼第一個實例會得到更新,其他則不會,但它解決了我的問題。