假设我有一个包含这两个不朽表的数据集:Employee&订单
Emp - > ID,名称
Ord - >东西,Anotherthing,EmpID
和关系 Rel :Ord(EmpID) - > Emp(ID)
在标准主/细节场景中效果很好
(向员工展示,跟进关系,显示相关订单),
但是当我不想采取相反的方式(用Emp.Name显示Ord表)时呢?
这样的事情:
<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>
有什么想法吗?我可以创建值转换器,但如果我不想使用从父模块获取的数据集实例,那就很棘手了。
答案 0 :(得分:1)
如果要同步多个控件的内容,则需要让它们通过在公共父控件上设置的 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控件的绑定源。
答案 1 :(得分:0)
假设您使用的是强类型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; }
}
}
然后,您将能够绑定到数据上下文中“OrdDataTable”对象的“EmpName”属性。
答案 2 :(得分:0)
两个TextBox控件的DataContext是什么?
为了使第二个绑定工作,必须将 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>