我不能完全理解下面的代码是怎么回事。WPF DataGridCell LostFocus事件停止冒泡DataGridRow
这是一个相对简单的wpf
数据网格,它显示对象的ObservableCollection
。如果我选择一行并按下删除键,则从DataGridCell
中触发LostFocus
事件。使用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的一部分。 – ethicallogics
的确如此,但DataGridCells和DataGridRows是其中的一部分。 – Andrew