wake-up-neo.com

WPF-Bindung an übergeordnetes DataContext

Wir haben eine WPF-Anwendung mit einem Standard-MVVM-Muster, das Cinch (und damit MefedMVVM) für die Auflösung von View -> ViewModel verwendet. Dies funktioniert gut und ich kann die relevanten Steuerelemente an die Eigenschaften des ViewModel binden.

In einer bestimmten Ansicht haben wir ein Infragistics XamGrid. Dieses Raster ist an eine ObservableCollection im ViewModel gebunden und zeigt die entsprechenden Zeilen an. Ich habe jedoch eine bestimmte Spalte in diesem Raster, die ich versuche, einen TextBox-Textwert an eine Eigenschaft im übergeordneten DataContext und nicht an die ObservableCollection zu binden. Diese Bindung schlägt fehl.

Wir haben hier mehrere Optionen durchlaufen, darunter:

  1. Verwenden Sie AncestorType, um den Baum aufzuspüren und sich so an den DataContext des übergeordneten UserControl zu binden (von tolle Antwort zu dieser Frage sowie dieses ) ...

    {Binding Path=PathToProperty, RelativeSource={RelativeSource AncestorType={x:Type typeOfAncestor}}}
    
  2. Angabe des Elementnamens und Versuch, direkt auf das Steuerelement der obersten Ebene zu zielen. Haben Sie ein schauen Sie hier , wenn Sie mehr über ElementName erfahren möchten.

  3. Verwenden eines "Proxy" -FrameorkElement, das in den Ressourcen für das UserControl definiert ist, um den Kontext nach Bedarf zu "übergeben". Wir definieren das Element wie folgt und verweisen dann auf eine statische Ressource ...

    <FrameworkElement x:Key="ProxyContext" DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource Self}}"></FrameworkElement>
    

In diesem Fall findet die Bindung das FrameworkElement, kann jedoch nicht auf etwas anderes zugreifen (wenn Sie einen Pfad angeben).

Nach dem Durchlesen ist es wahrscheinlich, dass dies durch die Infragistics XamGrid-Gebäudesäulen außerhalb des Baums verursacht wird. Selbst wenn dies der Fall ist, sollten zumindest die Optionen 2 oder 3 funktionieren.

Unsere letzten Gedanken sind, dass es mit der V - VM - Bindung zusammenhängt, aber selbst mit Snoop müssen wir noch herausfinden, was genau das Problem ist. Ich bin keinesfalls ein Experte für die WPF-Bindung, daher würden wir uns über Hinweise freuen.

EDIT: Ich habe einige Vorlagenbeispiele von Infragistics hier gefunden, die ich versuchen werde.

BEARBEITEN 2: Wie von @Dtex hervorgehoben, sind Vorlagen der Weg zu gehen. Hier ist das relevante Snippet für die Verwendung mit einem XamGrid:

<ig:GroupColumn Key="CurrentDate">
                <ig:GroupColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=DataContext.CurrentDateTest, RelativeSource={RelativeSource AncestorType=UserControl}}" />
                    </DataTemplate>
                </ig:GroupColumn.HeaderTemplate>
                <ig:GroupColumn.Columns>

Ich habe die XML-Datei offen gelassen. Sie fügen einfach die gewünschten Spalten hinzu und schließen dann die relevanten Tags.

40
Nick

Ich weiß nicht XamGrid, aber das ist was ich mit einem Standard-Wpf DataGrid mache:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=MyUserControl}}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding DataContext.MyProperty, RelativeSource={RelativeSource AncestorType=MyUserControl}}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Da die TextBlock und die TextBox, die in den Zellvorlagen angegeben sind, Teil der visuellen Baumstruktur sein werden, können Sie die gewünschten Steuerelemente aufrufen.

77
Dtex

Aufgrund von solchen Dingen versuche ich als Faustregel, so viele XAML- "Tricks" wie möglich zu vermeiden und die XAML so dumm und einfach wie möglich zu halten und den Rest im ViewModel (oder den angefügten Eigenschaften oder IValueConverters usw.) zu erledigen. wenn wirklich notwendig).

Wenn möglich, würde ich dem ViewModel des aktuellen DataContext eine Referenz (d. H. Eigenschaft) auf das entsprechende übergeordnete ViewModel geben

public class ThisViewModel : ViewModelBase
{
    TypeOfAncestorViewModel Parent { get; set; }
}

und binden Sie direkt dagegen.

<TextBox Text="{Binding Parent}" />

0
bitbonk