Неужели нет способа отслеживать родительское отношение набора данных в привязке xaml?

Предположим, у меня есть набор данных с этими двумя бессмертными таблицами: Сотрудник и Заказ
Emp -> ID, Имя
Ord -> Что-то, Другое, EmpID
И отношение Rel: Ord (EmpID) -> Emp (ID)

Он отлично работает в стандартном сценарии "основной/детальный"
(показать сотрудников, проследить связь, показать связанные заказы),
но что, если я не хочу идти в обратном направлении (показать таблицу Ord с Emp. Имя)?

Примерно так:

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

Любые идеи? Я могу создать преобразователь значений, но если я не хочу использовать экземпляр набора данных, который я получаю из родительского модуля, это становится сложно.


person cz_dl    schedule 14.10.2008    source источник


Ответы (3)


Если вы хотите синхронизировать содержимое нескольких элементов управления, вам потребуется, чтобы они совместно использовали один и тот же источник привязки через набор DataContext в общем родительском элементе управления. Вот пример:

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

Установка для свойства IsSynchronizedWithCurrentItem значения «True» приведет к автоматической синхронизации свойства ListBox.SelectedItem с CollectionView.CurrentItem источника привязки, это набор строк, установленных в DataContext. Это означает, что текущая выбранная строка в ListBox становится источником привязки для двух элементов управления TextBox.

person Enrico Campidoglio    schedule 24.10.2008

Предполагая, что вы используете строго типизированный набор данных, для привязки TextBox к свойству "EmpRow.Name" вам, вероятно, придется предоставить его как свойство в классе "OrdDataTable".

Поскольку Visual Studio генерирует типизированный код DataSet с частичными классами, вы можете добавить свойство в класс OrdDataTable следующим образом:

using System.Data;

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

Затем вы сможете привязаться к свойству «EmpName» объекта «OrdDataTable» в контексте данных.

person Enrico Campidoglio    schedule 16.10.2008

Что такое DataContext для двух элементов управления TextBox?
Чтобы вторая привязка работала, DataContext должен быть установлен на экземпляр USERSDataTable. Поскольку они содержатся в массиве в наборе данных, вы должны явно указать, к какой таблице вы хотите привязаться. Что-то типа:

<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>
person Enrico Campidoglio    schedule 21.10.2008