1

プロパティに応じて表示/非表示にする列を持つ DataGrid があります。列を表示/非表示にする運がなかったので、列を取り出して別の DataGrid に配置し、2 つ目の DataGrid を Expander 内に配置しました。2 番目の DataGrid のヘッダーは、Expander の DataContext にバインドされます (または DataGrid - 同じ効果で、それを含むユーザー コントロールにバインドしようとしました)。

            <Expander ExpandDirection="Right" Style="{DynamicResource ExpanderDirectionRight}" IsExpanded="{Binding ShowLaterDate}">
                <DataGrid AutoGenerateColumns="False" AlternationCount="2" SelectionMode="Single" ItemsSource="{Binding Rows, UpdateSourceTrigger=PropertyChanged}" CanUserDeleteRows="True" CanUserAddRows="False" CanUserResizeColumns="False" SnapsToDevicePixels="True" Visibility="{Binding Rows.HasContent, Converter={StaticResource BooleanToVisibilityConverter}}" HorizontalAlignment="Left" SelectedIndex="{Binding SelectedIndex, ElementName=BudgetDataGrid}">
                    <DataGrid.Columns>
                        <DataGridTemplateColumn CellTemplate="{StaticResource LaterDataTemplate}" Width="{StaticResource WidthOfValueColumns}">
                            <DataGridTemplateColumn.Header>
                                <Grid Margin="{StaticResource MarginOfTextBox}">
                                    <userControls:DateOrAgeEditor Date="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}, Path=DataContext.LaterDate, UpdateSourceTrigger=LostFocus}" DateOfBirth="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}, Path=DataContext.DateOfBirth}" TabIndex="11"/>
                                </Grid>
                            </DataGridTemplateColumn.Header>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                </DataGrid>
            </Expander>

これはすべて良いことです。

問題: ユーザー コントロールが表示されると、バインドされた値が表示されます。ただし、エキスパンダーが展開されている場合のみ! ユーザーコントロールが表示されているときに Expander が折りたたまれている場合、これは出力に出力されます。

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.Expander', AncestorLevel='1''. BindingExpression:Path=DataContext.DateOfBirth; DataItem=null; target element is 'DateOrAgeEditor' (Name='UserControl'); target property is 'DateOfBirth' (type 'DateTime')
System.Windows.Data Warning: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.Expander', AncestorLevel='1''. BindingExpression:Path=DataContext.LaterDate; DataItem=null; target element is 'DateOrAgeEditor' (Name='UserControl'); target property is 'Date' (type 'DateTime')

次に Expander が展開されると、バインディングは更新されず、「壊れた」状態が続きます。

質問: Expander が最初に展開されていない場合でも、バインドを正しくバインドするにはどうすればよいですか?

4

1 に答える 1

0

私の列の可視性をバインドする方法を見つけました ( http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not- inherited/ ) ただし、これはエキスパンダーと同じ問題を引き起こしました。しかし、簡単に修正できます。可視性と同じ種類のバインディングをヘッダー コンテンツに使用するだけです。

于 2013-10-07T11:22:07.873 に答える