XAML 바인딩에서 데이터 세트 부모 관계를 추적 할 방법이 실제로 없습니까?
-
03-07-2019 - |
문제
두 개의 불멸 테이블이있는 데이터 세트가 있다고 가정 해
emp -> ID, 이름
주문 -> 무언가, 또 다른 모든 것을, empid
그리고 관계 rel: ord (empid) -> emp (id)
표준 마스터/세부 시나리오에서 훌륭하게 작동합니다
(직원들을 보여주고, 관계를 따르고, 관련 명령을 보여줍니다),
그러나 내가 반대 방향으로 가지 않아야 할 때
이 같은:
<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>
어떤 아이디어? 값 변환기를 만들 수 있지만 부모 모듈에서 얻은 데이터 세트 인스턴스를 사용하지 않으면 까다로워집니다.
해결책
여러 컨트롤의 내용을 동기화하려면 동일한 바인딩 소스를 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>
설정 issynchronized withCurrentEM 'true'로가는 속성은 ListBox.SelectedItem 자동으로 동기화 할 속성 CollectionView.CurrentItem 바인딩 소스의 DataContext. 이는 ListBox에서 현재 선택된 행이 두 텍스트 상자 컨트롤의 바인딩 소스가된다는 것을 의미합니다.
다른 팁
텍스트 상자를 'emprow.name'속성에 바인딩하기 위해 강하게 유형 된 데이터 세트를 사용하고 있다고 가정하면 'OrdDatatable'클래스에 속성으로 노출해야 할 것입니다.
Visual Studio는 부분 클래스로 유형 된 데이터 세트 코드를 생성하므로 다음과 같은 방식으로 'OrdDatatable'클래스에 속성을 추가 할 수 있습니다.
using System.Data;
public partial class OrdDataTable : DataTable
{
public string EmpName
{
get { return this.EmpRow.Name; }
}
}
그런 다음 데이터 컨텍스트에서 'ordDatatable'객체의 'Empname'속성에 바인딩 할 수 있습니다.
두 텍스트 박스 컨트롤의 데이터 콘텍스트는 무엇입니까?
두 번째 바인딩이 작동합니다 DataContext '사용자 구분 가능'인스턴스로 설정해야합니다. 이것들은 데이터 세트의 배열에 포함되므로 어떤 테이블을 바인딩 할 것인지 명시 적으로 알려야합니다. 같은 것 :
<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>