Silverlight:使用DataContextProxy的替代方法?

时间:2011-06-06 21:01:36

标签: silverlight silverlight-4.0 memory-leaks

我们一直在使用基于(或完全)的DataContextProxy概念,如Dan Wahlin's Blog中所述。功能上这对我们的目的来说很好。但是,在进行了大量的内存分析之后,以及在线发现类似的报告之后(下面的链接),似乎这种方法由于UserControl.Resources的问题/错误而泄漏内存。

有没有人找到一个像DataContextProxy方法的合适替代品?

Connect Report,该问题已在SL 5中修复。我将尝试为SL4发布一个repro解决方案。

3 个答案:

答案 0 :(得分:3)

我提出了一些非常接近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,因为它似乎在最初解析绑定之前未获得viewmodel的子视图上更好。

答案 1 :(得分:0)

您可以查看相对源绑定的this SL实现。 Caliburn Micro还有一种方法可以通过Action冒泡来解决这个问题。

答案 2 :(得分:0)

我不知道内存泄漏问题,但是当Silverlight 4在绑定中引入ElementName时,它基本上不需要DataContextProxy

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

更多解释here