WPF ElementName 未及时初始化

WPF ElementName not initialized in time

在我的 MVVM 模型中,我将 UserControl 命名为:

x:Name="root"

在我的视图模型中有一个名为 AllChecked 的布尔值,顾名思义,它应该绑定到 xaml 文件中的一个复选框,指示是否应选中或取消选中数据网格中的所有行。

在我的 xaml 文件中,我有一个像这样的数据网格:

    <DataGrid  ItemsSource="{Binding SomeObservableCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged}"
                <DataGridCheckBoxColumn.Header>
                    <CheckBox IsChecked="{Binding DataContext.AllChecked, ElementName=root, Mode=TwoWay}" HorizontalAlignment="Center"/>
                </DataGridCheckBoxColumn.Header>
            </DataGridCheckBoxColumn>
            <DataGridTextColumn Header="Column A" Binding="{Binding Path=a}" Width="120" IsReadOnly="true"/>
            <DataGridTextColumn Header="Column B" Binding="{Binding Path=b, StringFormat=dd-MM-yyyy}" Width="120" IsReadOnly="true"/>
            <DataGridTextColumn Header="Column C" Binding="{Binding Path=c}" Width="90" IsReadOnly="true"/>
            <DataGridTextColumn Header="Column D" Binding="{Binding Path=d}" IsReadOnly="true" Width="130" />
        </DataGrid.Columns>
    </DataGrid>

当我启动应用程序时,AllChecked 的绑定不起作用,错误是

“找不到来源:ElementName = root”

如果我从 ElementName 中删除 root 并再次重写,它突然起作用了。我不知道发生了什么,但似乎是在定义 UserControl 的 x:Name 之前设置绑定的某种计时问题,也许吧?

有人能帮忙吗?

该列不属于 DataGrid 的逻辑树。所以 WPF 不知道从哪里获得 DataContext。这个问题的典型解决方案是一个叫做 BindingProxy 的东西。读这个:

https://thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/