Silverlight:使用DataContextProxy的替代方案?

Silverlight:使用DataContextProxy的替代方案?,silverlight,silverlight-4.0,memory-leaks,Silverlight,Silverlight 4.0,Memory Leaks,我们一直在使用DataContextProxy概念,其基础(或确切地说)如中所述。就我们的目的而言,这在功能上很有效。但是,在进行了大量内存分析之后,在联机发现类似的报告(下面的链接)之后,这种方法似乎是由于UserControl.Resources出现问题/错误而导致内存泄漏的 有人找到了DataContextProxy方法的合适替代方法吗 ,表示问题已在SL 5中解决。我将尝试发布一个针对SL4的复制解决方案。您可以查看相对源绑定的SL实现。Caliburn Micro也有一种通过操作冒泡来

我们一直在使用DataContextProxy概念,其基础(或确切地说)如中所述。就我们的目的而言,这在功能上很有效。但是,在进行了大量内存分析之后,在联机发现类似的报告(下面的链接)之后,这种方法似乎是由于UserControl.Resources出现问题/错误而导致内存泄漏的

有人找到了DataContextProxy方法的合适替代方法吗


,表示问题已在SL 5中解决。我将尝试发布一个针对SL4的复制解决方案。

您可以查看相对源绑定的SL实现。Caliburn Micro也有一种通过操作冒泡来解决此问题的方法。

我不知道内存泄漏问题,但由于Silverlight 4在绑定中引入了
ElementName
,它基本上消除了对
DataContextProxy
的需要:

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


更多解释。

我提出了一些非常接近DataContextProxy的东西,但是XAML中的声明绑定回类,而不是在类的加载事件中创建绑定。除了不漏水外,它的工作原理似乎完全一样。 希望其他人能证实这一点

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

将绑定更改为ElementName,因为它似乎更适合在绑定最初解决后才获得viewmodel的子视图

我很高兴我不是唯一一个注意到这一点的开发人员!请参阅我在此处的上一篇文章:不幸的是,
ElementName
绑定在
DataGrid
中不起作用。是
DataGrid
的实现错误可以纠正,还是发生在其他一些项目容器中?了解
ElementName
失败的根本技术原因将非常有用。您好@Mart很抱歉这么晚才回复您。我认为datagrid列集合只是一个属性,它不在逻辑/可视树中,ElementName绑定使用我相信的逻辑树。我发现,使用Silverlght 5的祖先绑定,不再需要DataContextProxy。:)救了我一天。非常感谢你,斯蒂芬。由于一些旧版本的依赖关系,我现在不选择迁移到SL5。这是一个如此简洁明了的解决方案。我喜欢。
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}}"