コードに問題があります...
次のようなものがあります。
<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 を使用して表示すると、最初は動作しません。バインディングを調べて掘り下げると、バインディングが機能するようになりました。
ビジュアル ツリー レベルでどのように構築されているのか、それとも何か奇妙な問題なのだろうか? 前に言ったように、他のビューでこれを何度か行ったことがありますが、問題なく動作します。私が間違ってやっている奇妙なことがあるはずです...