【发布时间】:2013-01-14 06:47:01
【问题描述】:
我不太明白下面这段代码发生了什么。
这是一个相对简单的wpf 数据网格,它显示了一个ObservableCollection 的对象。如果我选择一行,然后按删除键,LostFocus 事件将从DataGridCell 触发。使用 Snoop,我可以查看接收此路由(冒泡)事件的元素。它从DataGridCell 开始,向上冒泡,直到到达DataGridRow,然后停止(这在显示未处理和已处理事件的Snoop 中都很明显)。
我对冒泡事件的理解使我相信LostFocus 事件应该一直冒泡到父窗口。
什么给了?
<Window x:Class="ApplicationName.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="_grid">
<DataGrid
ItemsSource="{Binding Items}"
AutoGenerateColumns="False"
HeadersVisibility="Column"
CanUserDeleteRows="True"
SelectionUnit="FullRow">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=FirstName}"
Header="FirstName"/>
<DataGridTextColumn Binding="{Binding Path=LastName}"
Header="LastName"/>
<DataGridTextColumn Binding="{Binding Path=Information}"
Header="Information"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
代码隐藏:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
public class ViewModel
{
public ObservableCollection<Person> _items = new ObservableCollection<Person>();
public ViewModel()
{
_items.Add(new Person() { FirstName = "Homer", LastName = "Simpson", Information = "Father" });
_items.Add(new Person() { FirstName = "Bart", LastName = "Simpson", Information = "Son" });
_items.Add(new Person() { FirstName = "Santa's", LastName = "Little Helper", Information = "Dog" });
}
public ObservableCollection<Person> Items
{
get { return _items; }
}
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Information { get; set; }
}
【问题讨论】:
-
Datagrid 列不是 VisualTree 的一部分。
-
没错,但 DataGridCells 和 DataGridRows 是其中的一部分。
标签: wpf datagrid focus routed-events