Действительно ли нет способа отслеживать родительское отношение dataset в привязке xaml?
-
03-07-2019 - |
Вопрос
Предположим, у меня есть набор данных с этими двумя бессмертными таблицами:Сотрудник и Порядок
Эми -> Идентификатор, Имя
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>