¿Realmente no hay manera de hacer un seguimiento de la relación principal del conjunto de datos en el enlace xaml?

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

Pregunta

Supongamos que tengo un conjunto de datos con esas dos tablas inmortales: Employee & amp; Orden
Emp - > ID, nombre
Ord - > Algo, otra cosa, EmpID
Y la relación Rel : Ord (EmpID) - > Emp (ID)

Funciona muy bien en el escenario estándar maestro / detalle
(Mostrar empleados, seguir la relación, mostrar pedidos relacionados),
pero ¿qué pasa cuando no quiero ir en la dirección opuesta (mostrar la tabla Ord con Emp.Name)?

Algo como esto:

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

¿Alguna idea? Puedo crear un convertidor de valores, pero si no utilizo la instancia de conjunto de datos que obtengo del módulo principal, se vuelve complicado.

¿Fue útil?

Solución

Si desea sincronizar el contenido de varios controles, deberá hacer que compartan la misma fuente de enlace a través del conjunto DataContext en un control principal común. Aquí hay un ejemplo:

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

Al establecer la propiedad IsSynchronizedWithCurrentItem en 'Verdadero', la propiedad ListBox.SelectedItem se sincronizará automáticamente con el CollectionView.CurrentItem del fuente de enlace, que es la colección de filas establecida en DataContext . Esto significa que la fila actualmente seleccionada en el cuadro de lista se convierte en la fuente de enlace para los dos controles del cuadro de texto.

Otros consejos

Suponiendo que está utilizando un DataSet fuertemente tipado, para vincular el TextBox a la propiedad 'EmpRow.Name', probablemente deba exponerlo como una propiedad en la clase 'OrdDataTable'.

Dado que Visual Studio genera el código DataSet con clases parciales, puede agregar la propiedad a la clase 'OrdDataTable' de esta manera:

using System.Data;

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

Entonces, podrá enlazar a la propiedad 'EmpName' del objeto 'OrdDataTable' en el contexto de los datos.

¿Qué es el DataContext para los dos controles de TextBox?
Para que el segundo enlace funcione, DataContext debe configurarse en una instancia de 'USERSDataTable'. Dado que estos están contenidos en una matriz en el DataSet, debe indicar explícitamente a qué tabla desea enlazar. Algo como:

<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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top