Действительно ли нет способа отслеживать родительское отношение dataset в привязке xaml?

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

Вопрос

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

Это отлично работает в стандартном сценарии master / detail
(показать сотрудников, проследить за отношениями, показать связанные заказы),
но что, если я не хочу идти противоположным путем (показать таблицу 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>

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

Это было полезно?

Решение

Если вы хотите синхронизировать содержимое нескольких элементов управления, вам необходимо, чтобы они совместно использовали один и тот же источник привязки через 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' приведет к Список.Выбранный элемент свойство, которое будет автоматически синхронизировано с CollectionView.CurrentItem (Просмотр коллекции) источника привязки, то есть набора строк, установленных в DataContext - текст данных.Это означает, что текущая выбранная строка в ListBox становится источником привязки для двух элементов управления TextBox.

Другие советы

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

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

using System.Data;

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

Тогда вы смогли бы привязаться к свойству 'EmpName' объекта 'OrdDataTable' в контексте данных.

Что такое DataContext для двух элементов управления TextBox?
Для работы второй привязки необходимо DataContext - текст данных должен быть установлен экземпляр 'usersdatable'.Поскольку они содержатся в массиве 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top