У меня возникли проблемы с использованием DataContextProxy в моем приложении WPF. Когда я помещаю DataContextProxy в раздел «Ресурсы» Grid, он никогда не загружается. Если я переведу DataContextProxy из раздела ресурсов, все будет работать правильно.WPF DataContextProxy в разделе ресурсов
Я изучал это в течение некоторого времени и попробовал несколько методов для отладки приложения.
Я поместил DebugConverter на контроль, что я пытаюсь использовать прокси с. Конвертер Debug никогда не вызывается.
Я использовал WPFSnoop, чтобы увидеть, есть ли какие-либо ошибки привязки. Я получаю после ошибки привязки к DataContextProxy,
Ошибка System.Windows.Data: 3: Не удается найти элемент, предоставляющий DataContext. BindingExpression: (нет пути); DataItem = NULL; целевой элемент - «Прокси» (Name = ''); target свойство «DataContext» (тип «Объект»)
Я разместил точку останова в загруженном событии моего DataContextProxy. Загруженное событие никогда не вызывается, и я поместил точку останова в событие DataContextChanged, которое никогда не вызывается.
Вот пример кода для демонстрации этого. Очевидно, я знаю, что мне действительно не нужно использовать DataContextProxy в TextBox.
<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)
{
}
}