3

如果我指定祖先,则下面的组合框绑定有效,否则无效。如果我不指定祖先,为什么它不起作用?

<wpftoolkit:DataGrid Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="2"
                         Margin="5"
                         BorderBrush="#A6A6A6"
                         BorderThickness="1"
                         ItemsSource="{Binding DebitListing}"
                         AutoGenerateColumns="False"
                         SelectionMode="Single">
        <wpftoolkit:DataGrid.Columns>
            <wpftoolkit:DataGridComboBoxColumn
                Header="{Resx ResxName=MyBooks.Properties.Strings, Key=PartyListing_Party_Label}"
                SelectedItemBinding="{Binding Party, ValidatesOnDataErrors=True}"
                DisplayMemberPath="Name">

                <wpftoolkit:DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Path=DataContext.CreditedAccounts, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                    </Style>
                </wpftoolkit:DataGridComboBoxColumn.ElementStyle>
                <wpftoolkit:DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="{x:Type ComboBox}">
                        <Setter Property="ItemsSource" Value="{Binding Path=DataContext.CreditedAccounts, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                    </Style>
                </wpftoolkit:DataGridComboBoxColumn.EditingElementStyle>

            </wpftoolkit:DataGridComboBoxColumn>

            <wpftoolkit:DataGridTextColumn
                Header="{Resx ResxName=MyBooks.Properties.Strings, Key=PartyListing_Amount_Label}"
                Binding="{Binding Amount, ValidatesOnDataErrors=True}"/>
        </wpftoolkit:DataGrid.Columns>
    </wpftoolkit:DataGrid>
4

2 回答 2

2

您需要引用从中获取所需 DataContext 的祖先的原因是因为wpftoolkit更改了其呈现的子元素上的 datacontext。您会发现几乎所有 ListView/DataGrid 控件都是如此——子元素 DataContext 被更改为引用当前行或列所代表的集合项。如果您希望这些子元素的模板或样式中的某些内容基于控件的 DataContext 之外的属性,则需要使用RelativeSource Ancestor它来获取它。

我知道这很令人困惑,因为在基本 XAML 中,子元素总是自动继承其父元素的数据上下文,但 DataContext 就像任何其他 DependencyProperty 一样,复杂的控件可以根据需要对其进行不同的设置。

如果愿意,可以通过给父控件(或设置 DataContext 的任何元素)一个名称来简化语法,例如x:Name='ControlRoot'. 然后,当您需要返回根数据上下文时,您只需执行以下操作:

Value="{Binding ElementName=ControlRoot, Path=DataContext.CreditedAccounts}"
于 2012-04-17T14:05:11.473 回答
0

你的绑定必须指定哪个祖先的原因是每次你指定一个数据上下文(或者在这种情况下ItemsSource你的上DataGrid,它隐藏它的父级的数据上下文。你的组合框无权访问上面任何内容布局层次结构中的网格。要克服此限制,您可以指定要用于数据上下文的祖先。

于 2012-04-17T13:51:22.257 回答