Неужели нет способа следить за родительским отношением набора данных в привязке xaml? - PullRequest
1 голос
/ 15 октября 2008

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 24 октября 2008

Если вы хотите синхронизировать содержимое нескольких элементов управления, вам нужно, чтобы они совместно использовали один и тот же источник привязки через набор 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.

0 голосов
/ 21 октября 2008

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

<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>
0 голосов
/ 16 октября 2008

Предполагая, что вы используете строго типизированный DataSet, чтобы связать 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' в контексте данных.

...