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、レンダリングされた子要素のデータ コンテキストが変更されるためです。これは、ほとんどすべての ListView/DataGrid コントロールに当てはまることがわかります。子要素の DataContext は、現在の行または列が表すコレクション項目を参照するように変更されています。これらの子要素の Template または Style の何かを、コントロールの 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 に答える