是否真的没有办法在xaml绑定中跟进数据集父关系?

时间:2008-10-14 21:51:29

标签: wpf data-binding xaml dataset

假设我有一个包含这两个不朽表的数据集: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>

有什么想法吗?我可以创建值转换器,但如果我不想使用从父模块获取的数据集实例,那就很棘手了。

3 个答案:

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