Я создаю несколько прикрепленных свойств, одним из которых является DataTemplate.DataTemplate должен иметь созданный мной FrameworkElement, чтобы объявление XAML всего этого выглядело так:
<SomeControl m:ItemsSource="{Binding Source}">
<m:MyTemplate>
<DataTemplate>
<m:MyClass SomeDependency="{Binding Path}"/>
</DataTemplate>
</m:MyTemplate>
</SomeControl>
В коде для измененного обратного вызова MyTemplateProperty он выполняет итерацию по каждому элементу в Sourceи вызывает 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 от простого создания объектов?