WPF DataContextProxy na seção de recursos
Estou com problemas para usar um DataContextProxy no meu aplicativo WPF. Quando coloco um DataContextProxy na seção Recursos de uma Grade, ele nunca é carregado. Se eu mover o DataContextProxy para fora da seção de recursos, tudo funcionará corretamente.
Eu tenho investigado isso há algum tempo e tentei vários métodos para depurar o aplicativo.
Eu coloquei um DebugConverter no controle com o qual estou tentando usar o proxy. O conversor de depuração nunca é chamado.
Eu usei o WPFSnoop para ver se há algum erro de ligação. Eu recebo o seguinte erro de ligação no DataContextProxy,
Erro System.Windows.Data: 3: Não é possível localizar elemento que fornece DataContext. BindingExpression: (sem caminho); DataItem = nulo; o elemento de destino é 'Proxy' (Name = ''); propriedade de destino é 'DataContext' (tipo 'Object')
Eu coloquei um ponto de interrupção no evento carregado do meu DataContextProxy. O evento carregado nunca é chamado e eu coloquei um ponto de interrupção no evento DataContextChanged que nunca é chamado.
Aqui está um exemplo de código para demonstrar isso. Obviamente, eu sei que eu realmente não preciso usar um DataContextProxy no TextBox.
<code><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> </code>
A classe DataContextProxy
<code>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) { } } </code>