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/
在我的 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/