c# - DataTemplate 中的按钮如何注册并监听后面代码中按钮的加载事件,但无法访问数据上下文?
问题描述
我不明白为什么数据模板内的按钮可以知道加载的事件在后面的代码中,但不能简单地将后面的代码用作数据上下文。
我知道解决这个问题的解决方案,但我不确定为什么将命令绑定到数据模板中的按钮并不容易。
Xaml
<grid:RadDataGrid Margin="0" ItemsSource="{x:Bind _viewModel.Data, Mode=OneWay}" Width="600" HorizontalAlignment="Left">
<grid:RadDataGrid.Columns>
<grid:DataGridTemplateColumn Header="Delete" SizeMode="Fixed">
<grid:DataGridTemplateColumn.CellContentTemplate>
<DataTemplate>
<StackPanel x:Name="stackPanel" Style="{StaticResource ResourceKey=RadDataGridButtonPanel}">
<Button Command="{Binding _viewModel.DeleteCommand, ElementName=deleteView}" Loaded="DeleteButton_Loaded">
</Button>
</StackPanel>
</DataTemplate>
</grid:DataGridTemplateColumn.CellContentTemplate>
</grid:DataGridTemplateColumn>
</grid:RadDataGrid.Columns>
</grid:RadDataGrid>
代码背后
private readonly ViewModel _viewModel;
public DeleteView()
{
this.InitializeComponent();
_viewModel = new ViewModel();
this.DataContext = _viewModel;
}
private void DeleteButton_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
}
解决方案
这基于使用 XAML 编译器处理事件的方式以及 DataContext 的工作方式。在按钮上指定事件处理程序时,XAML 编译器会生成如下内容:
var button1 = Page.GetElement("buttonInTemplate") //Some magic to get the button
button1.Loaded += Page.DeleteButton_Loaded;
按钮本身实际上并不知道该事件,而是从 XAML 生成的代码将事件挂钩到相应的按钮。
另一方面,DataContext 由系统以不同方式处理。DataContext 是向下传播的东西。因此,您的按钮 DataContext 是通过向上走可视化树并找到为您提供 DataContext 的第一个元素来确定的。
推荐阅读
- java - 使用 Selenium 和 Java 在 Facebook 中发布状态
- ruby-on-rails - ActiveJob - MyJob.new.perform 和 MyJob.perform_now 有什么区别?
- android - “如何在打开模拟器时修复‘签名报告’”
- azure - 逻辑应用程序的 Cusom API 连接器的安全问题
- ios - 如何使用 SwiftUI 让我的 UI 很好地适应 iPad 屏幕?
- c# - 显示图像选定部分的着色器代码 - OpenTk
- mysql - 与其他人加入多对多表
- python-3.x - 如何使用 PythonQt 构建程序?
- apache-spark - 在 Spark 中缓存时内存膨胀
- smtp - 在 Ionos 虚拟云服务器上刷新电子邮件队列时发生异常