2 Stimmen

Benachrichtigung über geänderten DataContext in einer WPF-Ressource

Ich habe ein lästiges Problem mit WPF-Bindung. Im Grunde deklariere ich ein FrameworkElement in meiner UserControl-Ressourcen, aber dieses Element scheint nicht benachrichtigt zu werden, wenn der DataContext des übergeordneten UserControl ändert.

Im Grunde habe ich in meinem UserControl ein Popup im ItemTemplate für ein ItemsControl. In diesem Popup musste ich an etwas im ViewModel der übergeordneten Ansicht binden, also habe ich mir einen cleveren Trick ausgedacht. In Anlehnung an CollectionViewSource dachte ich mir, ich binde das ViewModel der übergeordneten View an eine Ressource und verwende diese Ressource dann, um das ViewModel aus dem DataTemplate zu erreichen, etwa so:

    <UserControl.Resources>
        <cont:ViewModelSource Source="{Binding}" x:Key="ParentViewModel"/>
    </UserControl.Resources>

Damit ich sie später verwenden kann:

CommandParameter="{Binding ViewModel.OpenEntity, Source={StaticResource ParentViewModel}}"

Das alles scheint zu funktionieren außer dass der DataContext auf der ViewModelSource nicht zurückgesetzt wird, wenn der DataContext des UserControls zurückgesetzt wird. Im Moment mache ich diese Arbeit hackily: Einstellung der Ressource DataContext in Code-behind auf die UserControl DataContextChanged Ereignis.

Ich habe einen Blick in Reflector geworfen, um zu sehen, wie CollectionViewSource dies tut, aber es scheint nichts Besonderes zu sein.

Weiß jemand, warum das passiert oder wie ich es beheben kann?

2voto

Dargos Punkte 31

Ich hatte das gleiche Problem, und ich habe eine Lösung gefunden.

Zuerst habe ich versucht, meine ViewModel als DataContext meiner Root-Element zu setzen. falsch.

Dann habe ich versucht, meine ViewModel als Ressource zu setzen und Bindung Quelle meiner Root-Element auf die Ressource festgelegt. falsch.

Schließlich habe ich einen IValueConverter erstellt, um ein Model (witch ist DataContext des Steuerelements) in ein ViewModel zu konvertieren. Dann binde ich den DataContext meines Root-Elements mit dem Konverter.

<UserControl.Resources>

    <local:PersonToControllerConverter x:Key="PersonToControllerConverter"/>

    <!--<local:PersonController x:Key="controller"
        Value="{Binding}"
        Parent="{Binding Path=DataContext,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}}"
        />-->

</UserControl.Resources>

<Border x:Name="root" BorderBrush="Black" BorderThickness="2" >
    <Border.DataContext>
        <MultiBinding Converter="{StaticResource PersonToControllerConverter}">
            <Binding/>
            <Binding Path="DataContext" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}"/>
        </MultiBinding>
    </Border.DataContext>

    <!--DataContext="{Binding Source={StaticResource controller}}">-->

    <!--<Border.DataContext>
        <local:PersonController
                    Value="{Binding}"
                    Parent="{Binding Path=DataContext,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}}}"
                    />
    </Border.DataContext>-->

Ich denke, dass, wenn der DataContext bricht die Bindung in einem Element, wenn der Datacontext auf einem Root-Element ändert, es auf die gebrochene Bindung stoppt.

1voto

user526227 Punkte 31

Vielleicht müssen Sie ein mittleres Objekt erstellen, das die INotifyPropertyChanged Schnittstelle.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X