WPF DataGrid CellEditEnding - DataSet не обновляет до уровня потерянного фокуса

Мне нужно иметь возможность обновлять значения набора данных, когда ячейка теряет фокус от редактирования. Я знаю, когда ячейка теряет фокус (CellEditEnding), но проблема в том, что фактическое обновление этого контекстного элемента не происходит, пока на самом деле не происходит фокусировка на этой строке. Это становится огромной проблемой, когда остается только один элемент, так как он никогда не потеряет фокус.

Как я могу убедиться, что каждый раз, когда редактирование столбца завершено (CellEditEnding), фактический контекст для этой строки обновляется в этой точке (а не только когда строка теряет фокус)

Спасибо заранее!

Ответ 2

Я встретил аналогичную проблему, у меня есть строка DataGrid, содержащая 5 столбцов. Данные из 5 столбцов будут обновляться в источнике только после того, как целая строка datagrid потеряла фокус.

После некоторого поиска я нашел простой способ сделать это. То есть добавить "UpdateSourceTrigger = LostFocus" в привязку данных в ячейке.

Например:

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <ComboBox DisplayMemberPath="Name"
                  ItemsSource="{Binding Path=MyDataSets}"
                  SelectedValue="{Binding Path=DataSelected, UpdateSourceTrigger=LostFocus}"/>
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>

Это сделает трюк, поэтому, когда каждая ячейка потеряла фокус, а не всю строку, данные из ячейки немедленно обновят источник.

Ответ 3

Просто перейдите к любому другому управлению вашим диалогом, вызвав [control]. Фокус(). Сделайте это внутри события OnClosing().

LostFocus - это триггер обновления по умолчанию для ячейки данных. Но само окно, а также граница или заголовок окна (и там есть системная кнопка "X" ) не могут получить фокус. Поэтому редактирование не заканчивается.

Ответ 4

Вы можете использовать любое событие PreviewMouseMove из любого другого объекта. В моем случае я хочу, чтобы datagrid потерял контроль, прежде чем добавлять к нему новую строку.

MainWindow.xaml.cs

private void MenuItem_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        Grid.CommitEdit();
    }

MainWindow.xaml

 <MenuItem Header="New Line" Command="{Binding CommandNewRow}" PreviewMouseMove="MenuItem_PreviewMouseMove"/>

MainWindowViewModel.cs

    public ICommand CommandNewRow
    {
        get
        {
            if (_commandNewRow == null)
            {
                _commandNewRow = new RelayCommand(p => CommandNewRowExecute(), p => CommandNewRowCanExecute());
            }
            return _commandNewRow;
        }
    }

    private void CommandNewRowExecute()
    {
       FileList.Add(new File("", ""));
    }

    private bool CommandNewRowCanExecute()
    {
        if (FileList.Count > 0)
            return true;
        return false;
    }