首页 > 解决方案 > 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)
        {

        }

标签: c#mvvmuwpuwp-xaml

解决方案


这基于使用 XAML 编译器处理事件的方式以及 DataContext 的工作方式。在按钮上指定事件处理程序时,XAML 编译器会生成如下内容:

var button1 = Page.GetElement("buttonInTemplate") //Some magic to get the button
button1.Loaded += Page.DeleteButton_Loaded;

按钮本身实际上并不知道该事件,而是从 XAML 生成的代码将事件挂钩到相应的按钮。

另一方面,DataContext 由系统以不同方式处理。DataContext 是向下传播的东西。因此,您的按钮 DataContext 是通过向上走可视化树并找到为您提供 DataContext 的第一个元素来确定的。


推荐阅读