次のコードで何が起こっているのかよくわかりません。
オブジェクト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; }
}