我不明白为什么数据模板内部的按钮可以知道加载的事件在代码后面,但不能简单地将代码后面用作数据上下文。
我知道解决这个问题的解决方案,但我不知道为什么将命令绑定到数据模板中的按钮不容易。
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的元素来确定的。