我们一直在使用基于(或完全)的DataContextProxy概念,如Dan Wahlin's Blog中所述。功能上这对我们的目的来说很好。但是,在进行了大量的内存分析之后,以及在线发现类似的报告之后(下面的链接),似乎这种方法由于UserControl.Resources的问题/错误而泄漏内存。
有没有人找到一个像DataContextProxy方法的合适替代品?
Connect Report,该问题已在SL 5中修复。我将尝试为SL4发布一个repro解决方案。
答案 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。