Silverlight: альтернатива использованию DataContextProxy? - PullRequest
2 голосов
/ 07 июня 2011

Мы использовали концепцию DataContextProxy, основанную на (или точно), как описано в блоге Дэна Уолина . Функционально это отлично работает для наших целей. Однако после выполнения обширного профилирования памяти и после обнаружения аналогичных отчетов в Интернете (ссылка ниже) кажется, что этот подход приводит к утечке памяти в результате проблемы / ошибки в UserControl.Resources.

Кто-нибудь нашел достойную альтернативу подходу DataContextProxy?

Отчет о подключении , в котором говорится, что проблема была исправлена ​​в SL 5. Я попытаюсь опубликовать репро-решение для SL4.

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Я придумал что-то очень близкое к DataContextProxy, но вместо привязки, создаваемой в событии Loaded класса, объявление в XAML связывается с классом.Кажется, работает точно так же, но не течет.Хотел бы кого-то еще, чтобы проверить это.

<UserControl.Resources>
    <local:DataContextProxy x:Key="DataContextProxy" ViewModel="{Binding Path=DataContext, ElementName=LayoutRoot, Mode=TwoWay}" />
</UserControl.Resources>

Класс

namespace Silverlight.Infrastructure
{
   /// <summary>
   /// Refactored to not leak. Set binding on ViewModel propery to DataContext of page, in Resources of page
   /// Binding in XAML on declaration of DataContextProxy
   /// Usage: <shared:DataContextProxy x:Key="DataContextProxy" ViewModel="{Binding Path=DataContext, RelativeSource={RelativeSource Self}, Mode=TwoWay}" />
   /// </summary>
   /// <remarks></remarks>
   public class DataContextProxy : DependencyObject
   {
      public static DependencyProperty ViewModelProperty =  DependencyProperty.Register("ViewModel", typeof (object), typeof (DataContextProxy), new PropertyMetadata(default(object)));

      public object ViewModel
      {
         get { return (object)GetValue(ViewModelProperty); }
         set { SetValue(ViewModelProperty, value); }
      }
   }
}

использование:

DataToBindTo="{Binding ViewModel.DataToBindTo, Source={StaticResource DataContextProxy}}"

Изменена привязка к ElementName, так как она лучше работала на дочерних представлениях, которые не получилимодель представления до тех пор, пока привязка не будет изначально разрешена.

0 голосов
/ 09 ноября 2011

Я не знаю о проблемах утечки памяти, но поскольку Silverlight 4 представил ElementName в привязках, он в основном устраняет необходимость в DataContextProxy:

<ListBox ItemsSource="{Binding DataContext.Languages, ElementName=LayoutRoot}">

Больше объяснений здесь .

0 голосов
/ 07 июня 2011

Вы можете посмотреть эту SL реализацию относительной привязки источника. У Caliburn Micro также есть способ решить эту проблему с помощью пузырькового действия.

...