WPF DataContextProxy im Abschnitt Ressourcen

Ich habe Probleme bei der Verwendung eines DataContextProxy in meiner WPF-Anwendung. Wenn ich einen DataContextProxy in den Ressourcenabschnitt eines Rasters lege, wird er niemals geladen. Wenn ich den DataContextProxy aus dem Ressourcenbereich verschiebe, funktioniert alles korrekt.

Ich habe dies seit einiger Zeit untersucht und eine Reihe von Methoden zum Debuggen der Anwendung ausprobiert.

Ich habe einen DebugConverter auf dem Steuerelement platziert, mit dem ich den Proxy verwenden möchte. Der Debug-Konverter wird nie aufgerufen.

Ich habe WPFSnoop verwendet, um festzustellen, ob Bindungsfehler vorliegen. Auf dem DataContextProxy wird der folgende Bindungsfehler angezeigt:

System.Windows.Data-Fehler: 3: Element, das DataContext bereitstellt, kann nicht gefunden werden. BindingExpression: (kein Pfad); DataItem = null; Zielelement ist 'Proxy' (Name = ''); Zieleigenschaft ist 'DataContext' (Typ 'Object')

Ich habe dem geladenen Ereignis meines DataContextProxy einen Haltepunkt hinzugefügt. Das geladene Ereignis wird niemals aufgerufen und ich habe einen Haltepunkt im DataContextChanged-Ereignis platziert, der niemals aufgerufen wird.

Hier ist ein Beispielcode, um dies zu demonstrieren. Natürlich weiß ich, dass ich keinen DataContextProxy für die TextBox verwenden muss.

<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>

Die DataContextProxy-Klasse

<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>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage