2013-01-14 78 views
0

我不能完全理解下面的代码是怎么回事。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; } 
    } 
+1

Datagrid列不是VisualTree的一部分。 – ethicallogics

+0

的确如此,但DataGridCells和DataGridRows是其中的一部分。 – Andrew

回答

0

如果父窗口的LostFocus事件触发,这意味着重点不是在父窗口了。你期望这种行为?我认为这不是你的情况。 DataGridRow失去焦点,DataGridCells失去焦点,但没有父窗口。

+0

我不希望父窗口失去焦点 - 只是为了让它有机会处理DataGridCell的LostFocus事件。 – Andrew