与wpf中的内部DataGrid绑定

时间:2013-05-22 10:39:04

标签: wpf xaml

我遇到与内部DataGrid绑定的问题。绑定适用于DataGrid“帐户”,但不适用于“记录”。我正在使用DataGrid.RowDetailsTemplate作为第二个Datagrid

<Grid>
<Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<DataGrid ItemsSource="{Binding AccountList}" AutoGenerateColumns="False" x:Name="Account">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding AccountNumber}" Header="Account Number" FontSize="16"/>
        <DataGridTextColumn Binding="{Binding Name}" Header="Name" FontSize="16"/>
    </DataGrid.Columns>
    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <DataGrid ItemsSource="{Binding RecordList,Mode=TwoWay}" AutoGenerateColumns="False" x:Name="Record" IsSynchronizedWithCurrentItem="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding RecordNumber}" Header="Record Number" FontSize="16"/>
                    <DataGridTextColumn Binding="{Binding Name}" Header="Name" FontSize="16"/>
                </DataGrid.Columns>
            </DataGrid>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

</Grid>

<Grid Grid.Row="1">
    <TextBlock Text="Account Number:"> <TextBox Text="{Binding ElementName=Account, Path=SelectedItem.AccountNumber}" x:Name="ANr"/>
    <TextBlock Text="Record Number:"> <TextBox Text="{Binding ElementName=Record, Path=SelectedItem.RecordNumber}" x:Name="RecordText"/>

</Grid>

错误消息:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=Record'. BindingExpression:Path=SelectedItem.RecordNumber; DataItem=null; target element is 'TextBox' (Name='RecordText'); target property is 'Text' (type 'String')

第一个TextBox绑定没有问题。第二个没有绑定。

谢谢

1 个答案:

答案 0 :(得分:2)

这是因为您的内部DataGrid名称Record仅在DataTemplate的上下文中有效。将为每一行重复此数据模板,因此无法通过名称真正绑定到控件。您需要做什么而不是必须通过SelectedItem外部DataGrid进行绑定,但为此您需要Account个对象中的某些内容来说明在内部网格中选择了哪一行。首先,您需要在SelectedRecord类中创建Account,将内部网格绑定到SelectedItem然后您可以这样做:

<TextBlock Text="Record Number:"> 
<TextBox Text="{Binding ElementName=Account, 
   Path=SelectedItem.SelectedReocrd.RecordNumber}" 
   x:Name="RecordText"/>