我在 WPF 应用程序中使用 DataContextProxy 时遇到问题。当我将 DataContextProxy 放在 Grid 的 Resources 部分时,它永远不会加载。如果我将 DataContextProxy 移出资源部分,一切正常。
我已经对此进行了一段时间的调查,并尝试了多种方法来调试应用程序。
我在尝试使用代理的控件上放置了一个 DebugConverter。调试转换器永远不会被调用。
我使用 WPFSnoop 来查看是否有任何绑定错误。我在 DataContextProxy 上收到以下绑定错误,
System.Windows.Data 错误:3:找不到提供 DataContext 的元素。BindingExpression:(无路径);数据项=空;目标元素是'代理'(名称='');目标属性是“DataContext”(类型“对象”)
我在 DataContextProxy 的加载事件上放置了一个断点。永远不会调用加载的事件,并且我在从未调用过的 DataContextChanged 事件中放置了一个断点。
这是一些示例代码来演示这一点。显然我知道我并不真的需要在 TextBox 上使用 DataContextProxy。
<Window x:Class="WpfDataContextProxyBug.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfDataContextProxyBug"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:DebugConverter x:Key="DebugConverter"/>
</Window.Resources>
<Grid>
<Grid.Resources>
<local:Proxy x:Key="Proxy" DataContext="{Binding}" />
</Grid.Resources>
<TextBox DataContext="{Binding Path=Name, Source={StaticResource Proxy}, Converter={StaticResource DebugConverter}}"/>
</Grid>
</Window>
DataContextProxy 类
public class Proxy : FrameworkElement
{
public Proxy()
{
Loaded += DataContextProxy_Loaded;
DataContextChanged += Proxy_DataContextChanged;
}
void Proxy_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
}
void DataContextProxy_Loaded(object sender, RoutedEventArgs e)
{
}
}