9 Stimmen

Gibt es eine einfache Möglichkeit, eine WPF-Datenbindung angeben, wo der Pfad eine "Ebene" oben ist?

Dieses Beispiel ist zugegebenermaßen ein wenig konstruiert, aber ich mache etwas Ähnliches. Nehmen wir an, ich habe die folgenden einfachen Klassen:

public class Person
{
    public string Name { get; set; }
    public List<Alias> Aliases { get; set; }
}

public class Alias
{
    public string AliasName { get; set; }
}

Und nehmen wir an, dass ich Xaml mit einem LayoutRoot-Gitter und einem DataGrid habe, wo ich auf die Eigenschaft Name innerhalb des DataGrid zugreifen möchte stattdessen der Aliaseigenschaften wie in der zweiten Spalte hier:

<Grid x:Name="LayoutRoot" DataContext="PersonInstance">
    <DataGrid ItemsSource="{Binding Aliases}">
        <DataGrid.Columns>
            <data:DataGridTextColumn Header="AliasName" Binding="{Binding AliasName, Mode=TwoWay}"/>
            <data:DataGridTextColumn Header="Name" Binding="{Binding ../Name, Mode=TwoWay}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

So würde ich intuitiv versuchen, den Namen zu binden, aber das sieht natürlich blöd aus. Gibt es so etwas, wenn Sie einen Pfad angeben, oder sind Sie gezwungen, eine relative Quelle bis zum LayoutRoot-Datenkontext zu erhalten. Wenn man das muss, was ist dann der effizienteste Weg?

0 Stimmen

Warum funktioniert das nicht? Binding="{Binding Name, Mode=TwoWay}"

0 Stimmen

@Veer, weil es in der Klasse Alias keine Eigenschaft Name gibt...

0 Stimmen

@Anvaka: Aber der Datentext wird auf die Instanz der Personenklasse gesetzt. Er sollte die Eigenschaft Name kennen.

16voto

Nitin Chaudhari Punkte 1467

Das sollte für Sie funktionieren:

<DataGridTextColumn Header="Name" 
                    Binding="{Binding RelativeSource={RelativeSource 
                                                      FindAncestor,
                                                      AncestorLevel=3, 
                                                      AncestorType={x:Type Grid},
                                                    Path=DataContext.Name}"/>

Sie können eine der folgenden Möglichkeiten nutzen:

Das Quellelement wird mit dem nächstgelegenen übergeordneten Element eines bestimmten Typs gleichgesetzt:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type
desiredType}}}

Das Quellelement soll dem n-ten übergeordneten Element eines bestimmten Typs entsprechen:

{Binding RelativeSource={RelativeSource FindAncestor,
AncestorLevel=n, AncestorType={x:Type desiredType}}}

Um das Quellelement mit dem vorherigen Datenelement in einer datengebundenen Sammlung gleichzusetzen:

{Binding RelativeSource={RelativeSource PreviousData}}

3 Stimmen

Das ist unverschämt langatmig. Ihr erstes Beispiel sollte folgendermaßen lauten {Binding RelativeSource={RelativeSource FindAncestor,Grid,3}} . Die anderen sollten ebenfalls vereinfacht werden. Jeder, der die Funktion von FindAncestor versteht, wird verstehen FindAncestor,Grid,3 genauso einfach wie Ihre vier Codezeilen, und das mit weniger Denkaufwand.

0voto

Anvaka Punkte 15288

Ich denke, es gibt keinen besseren Weg, dies zu tun, als die relative Quelle im Baum zu verwenden. Sie könnten Ihr Modell umschreiben (z.B. einen Verweis auf das übergeordnete Modell hinzufügen Person de Alias ), aber das ist kaum ein besserer Ansatz.

Was die Leistung angeht, so habe ich nie Engpässe bei relativen Quelltextbindungen festgestellt. Es gibt immer etwas anderes, das Ihre Anwendung von der Raketengeschwindigkeit abhält.

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