4

コードに問題があります...

次のようなものがあります。

<DataGrid AutoGenerateColumns="False"
          CanUserAddRows="False"
          CanUserDeleteRows="False"
          ItemsSource="{Binding Path=RowData,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
          RowHeaderWidth="0">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.Header>
                <CheckBox IsChecked="{Binding RelativeSource={RelativeSource Findancestor, AncestorType={x:Type UserControl}},Path=DataContext.AreAllSelected}">
                    Select All
                </CheckBox>
            </DataGridTemplateColumn.Header>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Path=IsSelected,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>  
    <DataGrid.Columns>
</DataGrid>

タイプ UserControl から派生したビューにあります-絶対に確実です。何らかの理由で、TemplateColumn ヘッダーの CheckBox でバインディングが失敗します。珍しいのは、私がこのコードを他のビューに持っていることです。それはまったく問題なく動作します。私は常に最初に ViewModel を作成し、それをパラメーターとして View に渡します。ここで、DataContext は構築時に ViewModel に設定されます。つまり、

View(ViewModel myViewModel)
{
   InitializeComponent();
   DataContext = myViewModel;
}

ViewModel には AreAllSelected プロパティがありますが、次のエラーが表示されるため、何らかの理由で祖先が見つからないことがわかります。

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

奇妙なことに、動作しないにもかかわらず、Snoop を使用して表示すると、最初は動作しません。バインディングを調べて掘り下げると、バインディングが機能するようになりました。

ビジュアル ツリー レベルでどのように構築されているのか、それとも何か奇妙な問題なのだろうか? 前に言ったように、他のビューでこれを何度か行ったことがありますが、問題なく動作します。私が間違ってやっている奇妙なことがあるはずです...

4

1 に答える 1