DataGrid Lostfocus事件触发DataGrid WPF上的每个操作

时间:2018-03-21 13:18:45

标签: c# wpf datagrid

我想只在我们退出控件时才更新DataGrid的值。所以为了实现这个,我使用了datagrid的LostFocus事件。但是此事件会触发datagrid的每个操作。例如,当我在单元格上进行编辑时,它就会触发。

控制ctrl = FocusManager.GetFocusedElement(this)作为Control;总是为空。 :(

DataGrid simpleTable = new DataGrid();
        DataGridTextColumn textColumn = new DataGridTextColumn();
        textColumn.Width = new DataGridLength(DefaultSize.Width/2, DataGridLengthUnitType.Pixel);

        simpleTable.Style = tableStyle;
        textColumn.Binding = new Binding("Value");
        textColumn.ElementStyle = elementStyle;
      //  textColumn.Width = DataGridLength.SizeToCells;
        simpleTable.Columns.Add(textColumn);

        simpleTable.ItemsPanel = template;
        simpleTable.LostFocus += _dataGridLostFocus;

private void _dataGridLostFocus(object sender, RoutedEventArgs e)
    {
        Control ctrl = FocusManager.GetFocusedElement(this) as Control;
        if (ctrl.Parent != null && ctrl.Parent.GetType() != typeof(DataGridCell))
            MessageBox.Show("outside!");}

2 个答案:

答案 0 :(得分:1)

如果我没记错的话,DataGrid会丢失Focus,因为内部控件确实收到了它。

请使用该属性或此事件尝试IsKeyboardFocusWithin

答案 1 :(得分:0)

DataGridCell失去焦点时,会触发DataGrid迷失焦点事件。您需要处理单元格事件。

将此款式投放到DataGrid

<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <EventSetter Event="LostFocus" Handler="DataGridCell_LostFocus"/>
    </Style>
</DataGrid.CellStyle>

然后在你的代码中

private void DataGridCell_LostFocus(object sender, RoutedEventArgs e)
{
    e.Handled = true;
}

编辑:由于您是动态创建DataGrid,因此以下是如何设置DataGrid单元格的样式以订阅上面的丢失焦点事件。

创建一个delagate

 private delegate void Lost_Focus_Delegate(object sender, RoutedEventArgs e);

然后在你的DataGrid代中。

 Style style = new Style
 {
     TargetType = typeof(DataGridCell)
 };

 style.Setters.Add(new EventSetter(LostFocusEvent, new RoutedEventHandler(new Lost_Focus_Delegate(this.DataGridCell_LostFocus))));

 dataGrid.CellStyle = style;