1

DataGridTextColumn のヘッダー列をバインドしようとすると問題が発生するようです。このコードは、TabControl/TabItem をラップしていない場合は正常に機能しますが、TabControl に配置すると、DayHeader を見つけることができなくなります。FindAncestor/AncestoryType に問題があると思いますが、それを修正するために何をすべきか、またはそれが本当に問題であるかどうかはわかりません。どんな助けでも大歓迎です。

<!--Not Working
<TabControl Margin="0,25,0,0" Background="{x:Null}">
    <TabItem >
        <Grid >
            <DataGrid></DataGrid>
        </Grid>
    </TabItem>
    <TabItem Header="Test Header">-->

<!--Working-->
<Grid>
    <DataGrid ItemsSource="{Binding RunningViewSource.View}" Margin="0,27,0,-5" SelectionMode="Single">
        <DataGrid.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel VirtualizingStackPanel.VirtualizationMode="Recycling" />
            </ItemsPanelTemplate>
         </DataGrid.ItemsPanel>
         <DataGrid.Columns>
             <DataGridTextColumn Header="Contingencies" Binding="{Binding Contingencies}"
                                            IsReadOnly="True" Width="400" />
             <DataGridTextColumn Binding="{Binding Days[4]}" CellStyle="{StaticResource NumberCell}">
                 <DataGridTextColumn.Header>
                     <TextBlock Text="{Binding DataContext.DayHeader, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}">
                     </TextBlock>
                  </DataGridTextColumn.Header>
             </DataGridTextColumn>
         </DataGrid.Columns>
     </DataGrid>
</Grid>

<!--Not Working
    </TabItem>
</TabControl>-->

これは、動作していない部分を追加した場合に出力ウィンドウに表示されるメッセージです。

System.Windows.Data エラー: 4 : 参照 'RelativeSource FindAncestor、AncestorType='System.Windows.Controls.DataGrid'、AncestorLevel='1'' でバインディングのソースが見つかりません。BindingExpression:Path=DataContext.DayHeader; DataItem=null; ターゲット要素は 'TextBlock' (Name='') です。ターゲット プロパティは 'Text' (タイプ 'String') です

編集: 複数の TabItem を持つ TabControl がある場合にのみ、このエラーを再現できます。コードを更新しました。混乱して申し訳ありませんが、他の TabItem を追加すると、DayHeader に到達できなくなります。

Edit2: 多くの人が Snoop を使用して拘束力のある問題を解決していることを知っています。Snoop で列ヘッダーを調べると、ハイライトするとテキストが魔法のように表示されます。これがうまくいく理由がわからないので、スヌープについてもっと知識のある人が助けてくれることを願っています. DayHeader にアクセスするためのコード ビハインドを次に示します。

//Code Behind
 private string dayHeader;

    public string DayHeader
    {
        get { return dayHeader; }
        set
        {
            dayHeader = value;
            NotifyOfPropertyChange(() => DayHeader);
        }
    }

助けてくれてありがとう。

4

1 に答える 1

3

DataGridTextColumn.Headerはビジュアル ツリーにないため、DataContext を継承していません。この記事Freezableに示されているようにクラスを使用できます。

于 2013-06-26T11:56:52.070 に答える