Gibt es wirklich keine Möglichkeit, Daten-Set Eltern Beziehung in XAML zu verfolgen verbindlich?

StackOverflow https://stackoverflow.com/questions/202990

Frage

Angenommen, ich habe einen Datensatz mit diesen beiden unsterblichen Tabellen: Mitarbeiter & Order
Emp -> ID, Name
Ord -> Etwas, Anotherthing, EmpID
Und Relation Rel : Ord (EmpID) -> Emp (ID)

Es funktioniert großartig in Standard-Master / Detail-Szenario
(Zeigen Mitarbeiter, folgen Sie die Beziehung, zeigen bezogene Aufträge), Frankreich aber was, wenn ich wan't den umgekehrten Weg zu gehen (zeige Ord-Tabelle mit Emp.Name)?

So etwas wie folgt aus:

<stackpanel>   // with datacontext set from code to dataset.tables["ord"]
   <TextBox Text="{Binding Something}"/>
   <TextBox Text="{Binding Anotherthing}"/>
   <TextBox Text="{Binding ???}"/> // that's my problem, how to show related Emp.Name 
</stackpanel>

Irgendwelche Ideen? Ich kann Werteumwandler schaffen, aber wenn ich wan't Dataset Instanz zu verwenden, die ich von den Eltern bekommen Modul wird es schwierig.

War es hilfreich?

Lösung

Wenn Sie den Inhalt mehrerer Steuerelemente synchronisieren möchten, müssen Sie sie die gleiche Bindungsquelle teilen müssen durch die Datacontext Auf einem gemeinsamen übergeordneten Steuerung. Hier ein Beispiel:

<StackPanel>
    <StackPanel.Resources>
        <ObjectDataProvider x:Key="ds" ObjectType="{x:Type mynamespace:MyDataSet}" />
    </StackPanel.Resources>

    <!-- We set the data context to the collection of rows in the table -->
    <StackPanel DataContext="{Binding Source={StaticResource ds}, Path=USERS.Rows}">
        <ListBox ItemsSource="{Binding}"
                 DisplayMemberPath="NAME"
                 IsSynchronizedWithCurrentItem="True" />
        <TextBox Text="{Binding Path=NAME}"/>
        <TextBox Text="{Binding Path=COUNTRIESRow.NAME}"/>
    </StackPanel>
</StackPanel>

Durch Einstellen der IsSynchronizedWithCurrentItem Eigenschaft auf 'True' bewirkt, dass der ListBox.SelectedItem Eigenschaft automatisch mit dem CollectionView.CurrentItem synchronisiert werden von den Bindungsquelle ist, dass die Sammlung von Reihen in der Datacontext gesetzt. Dies bedeutet, dass die aktuell ausgewählte Zeile in der List-Box für die beiden Textboxsteuerelemente die Bindungsquelle wird.

Andere Tipps

Unter der Annahme, dass Sie eine stark typisierte Datasets verwenden, um die TextBox auf die "EmpRow.Name Eigentum zu binden, werden Sie wahrscheinlich es als Eigenschaft aussetzen müssen auf der‚OrdDataTable‘Klasse.

Da Visual Studio des typisierte DataSet-Code mit partiellen Klassen erzeugt, können Sie die Eigenschaft auf den ‚OrdDataTable‘ Klasse hinzufügen auf diese Weise:

using System.Data;

public partial class OrdDataTable : DataTable
{
    public string EmpName
    {
        get { return this.EmpRow.Name; }
    }
}

Dann würden Sie auf die ‚EmpName‘ Eigenschaft des ‚OrdDataTable‘ Objekt im Datenkontext binden können.

Was die Datacontext für die beiden Textboxsteuerelemente ist?
Für die zweite Bindung der arbeiten Datacontext muss eine Instanz des ‚USERSDataTable‘ gesetzt werden. Da diese in einem Array in dem Datensatz enthalten sind, müssen Sie explizit, welche Tabelle Sie sagen binden möchten. So etwas wie:

<StackPanel>
    <StackPanel.Resources>
        <ObjectDataProvider x:Key="ds" ObjectType="{x:Type mynamespace:MyDataSet}" />
    </StackPanel.Resources>

    <!-- Notice we set the data context to the first item in the array of tables -->
    <StackPanel DataContext="{Binding Source={StaticResource ds}, Path=USERS[0]}">
        <TextBox Text="{Binding NAME}"/>
        <TextBox Text="{Binding COUNTRIESRow.NAME}"/>
    </StackPanel>
</StackPanel>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top