我想只在我们退出控件时才更新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!");}
答案 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;