Изменения DataContext не всегда вызывают обновления привязки для класса из DataTemplate.LoadContent - PullRequest
2 голосов
/ 08 марта 2011

Я создаю несколько прикрепленных свойств, одним из которых является 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 от простого создания объектов?

1 Ответ

2 голосов
/ 08 марта 2011

Сотрудник указал на то, что ничто не держит экземпляры MyClass. Добавление способа ссылки на эти экземпляры решило проблему, которую я видел. Не совсем понятно, почему первый экземпляр получит обновления, а остальные нет, но это исправило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...