N'y a-t-il vraiment aucun moyen de suivre la relation parent de l'ensemble de données dans la liaison xaml?

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

Question

Supposons que j'ai un jeu de données avec ces deux tables immortelles: Employee & amp; Commande
Emp - > ID, nom
Ordre - > Quelque chose, autre chose, EmpID
Et la relation Rel : Ord (EmpID) - > Emp (ID)

Cela fonctionne très bien dans le scénario maître / détail standard
(montrer aux employés, suivre la relation, montrer les ordres connexes),
mais que faire quand je ne veux pas aller dans le sens opposé (montrer la table Ord avec Emp.Name)?

Quelque chose comme ça:

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

Des idées? Je peux créer un convertisseur de valeur, mais si je ne veux pas utiliser une instance de jeu de données provenant du module parent, cela devient délicat.

Était-ce utile?

La solution

Si vous souhaitez synchroniser le contenu de plusieurs contrôles, vous devez les faire partager la même source de liaison via l'ensemble DataContext d'un contrôle parent commun. Voici un exemple:

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

Si vous définissez la propriété IsSynchronizedWithCurrentItem sur "True", la propriété ListBox.SelectedItem sera automatiquement synchronisée avec le CollectionView.CurrentItem de la source de liaison, c'est-à-dire la collection de lignes définie dans le DataContext . Cela signifie que la ligne actuellement sélectionnée dans le contrôle ListBox devient la source de liaison pour les deux contrôles TextBox.

Autres conseils

En supposant que vous utilisez un DataSet fortement typé, afin de lier l'objet TextBox à la propriété 'EmpRow.Name', vous devrez probablement l'exposer en tant que propriété de la classe 'OrdDataTable'.

Etant donné que Visual Studio génère le code DataSet typé avec des classes partielles, vous pouvez ajouter la propriété à la classe 'OrdDataTable' de cette façon:

using System.Data;

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

Vous pourrez alors vous lier à la propriété 'EmpName' de l'objet 'OrdDataTable' dans le contexte de données.

Qu'est-ce que le DataContext pour les deux contrôles TextBox?
Pour que la deuxième liaison fonctionne, DataContext doit être défini sur une instance de 'USERSDataTable'. Comme ils sont contenus dans un tableau du DataSet, vous devez indiquer explicitement à quelle table vous voulez vous connecter. Quelque chose comme:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top