Non c'è davvero alcun modo per seguire la relazione parent del set di dati nell'associazione xaml?

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

Domanda

Supponiamo di avere un set di dati con quelle due tabelle immortali: Employee & amp; Ordina
Emp - > ID, nome
Ord - > Qualcosa, qualcos'altro,

E relazione Rel : Ord (EmpID) - > Emp (ID)

Funziona benissimo nello scenario master / dettaglio standard
(mostra dipendenti, segui la relazione, mostra ordini correlati),
ma cosa succede quando non voglio andare nella direzione opposta (mostra la tabella Ord con Emp.Name)?

Qualcosa del genere:

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

Qualche idea? Posso creare un convertitore di valore, ma se non voglio usare l'istanza del set di dati che ottengo dal modulo genitore diventa complicato.

È stato utile?

Soluzione

Se desideri sincronizzare i contenuti di più controlli, dovrai farli condividere la stessa origine di associazione tramite DataContext impostato su un controllo principale comune. Ecco un esempio:

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

Impostando la proprietà IsSynchronizedWithCurrentItem su 'True', la proprietà ListBox.SelectedItem verrà automaticamente sincronizzata con la CollectionView.CurrentItem fonte vincolante, ovvero la raccolta di righe impostata in DataContext . Ciò significa che la riga attualmente selezionata in ListBox diventa l'origine dell'associazione per i due controlli TextBox.

Altri suggerimenti

Supponendo che tu stia utilizzando un DataSet fortemente tipizzato, al fine di associare TextBox alla proprietà 'EmpRow.Name', probabilmente dovrai esporlo come proprietà sulla classe 'OrdDataTable'.

Poiché Visual Studio genera il codice DataSet tipizzato con classi parziali, è possibile aggiungere la proprietà alla classe 'OrdDataTable' in questo modo:

using System.Data;

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

Quindi sarà possibile associare la proprietà "EmpName" dell'oggetto "OrdDataTable" nel contesto dei dati.

Che cos'è DataContext per i due controlli TextBox?
Perché la seconda associazione funzioni, DataContext deve essere impostato su un'istanza di 'USERSDataTable'. Poiché questi sono contenuti in un array nel DataSet, è necessario indicare esplicitamente a quale tabella si desidera associare. Qualcosa del tipo:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top