Эквивалент EndEdit в WPF - PullRequest
       17

Эквивалент EndEdit в WPF

6 голосов
/ 20 мая 2009

У меня есть окно WPF, которое содержит TextBox. Я реализовал команду, которая выполняется на Crtl-S, которая сохраняет содержимое окна. Моя проблема в том, что если текстовое поле является активным элементом управления, и я недавно отредактировал текст в текстовом поле, последние изменения в текстовом поле не фиксируются. Мне нужно выйти из текстового поля, чтобы получить изменения.

В WinForms я обычно вызываю EndEdit в форме, и все ожидающие изменения будут зафиксированы. Другой альтернативой является использование привязки onPropertyChange, а не onValidation, но я бы не стал этого делать.

Что такое WPF, эквивалентный EndEdit, или какой шаблон использовать в сценарии этого типа?

Спасибо

Ответы [ 6 ]

6 голосов
/ 20 мая 2009

Основываясь на ответе Pwninstein, я теперь реализовал EndEdit в моем общем классе для WPF Views / Windows, который будет искать привязки и обновлять их, код ниже;

код ниже;

private void EndEdit(DependencyObject parent)
{
    LocalValueEnumerator localValues = parent.GetLocalValueEnumerator();
    while (localValues.MoveNext())
    {
        LocalValueEntry entry = localValues.Current;
        if (BindingOperations.IsDataBound(parent, entry.Property))
        {
            BindingExpression binding = BindingOperations.GetBindingExpression(parent, entry.Property);
            if (binding != null)
            {
                binding.UpdateSource();
            }
        }
    }            

    for(int i=0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(parent, i);
        this.EndEdit(child);
    }
}

protected void EndEdit()
{
    this.EndEdit(this);
}

В моей команде Сохранить я сейчас просто вызываю метод EndEdit, и мне не нужно беспокоиться о выборе другими программистами метода привязки.

5 голосов
/ 20 мая 2009

Вы можете принудительно обновить определенные привязки, используя следующий код:

var bindingExpression = txtInput.GetBindingExpression(TextBox.TextProperty);
bindingExpression.UpdateSource();

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

4 голосов
/ 20 мая 2009

Чтобы избежать необходимости вкладывать, вы можете просто изменить свойство UpdateSourceTrigger привязки ваших элементов управления. Попробуйте следующее:

<TextBox.Text>
    <Binding Path="MyProperty" UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>

Это говорит WPF обновлять объект поддержки при каждом изменении свойства Text. Таким образом, вам не нужно беспокоиться о вкладках. Надеюсь, это поможет!

EDIT:

Принятый ответ на следующий вопрос SO позволяет автоматически запускать правила проверки для страницы. Вместо этого вы можете изменить его так, чтобы он вызывал UpdateSource () для всех объектов BindingExpression.

Ссылка

3 голосов
/ 20 мая 2009

Я не согласен с ArielBH. Проблема здесь заключается во взаимодействии между клавиатурой и логическим фокусом, и если вы не изменили все триггеры обновления привязки данных на PropertyChanged, вы можете пропустить некоторые обновления исходных данных в определенных сценариях (например, щелчки кнопок панели инструментов). Например, триггером обновления по умолчанию для TextBox.Text является LostFocus, и нажатие на кнопку на панели инструментов не размывает активный фокус TextBox.

Если у вас есть какой-то механизм для регистрации элементов управления, то вы можете явно заставить привязку данных обновить источник в том же месте, где вы вызывали бы EndEdit в приложении WinForms. Это не опрятно или элегантно, но это делает работу.

Если бы кто-то придумал лучшее решение, я бы тоже все услышал.

1 голос
/ 06 июля 2010

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

<Window.BindingGroup>
    <BindingGroup />
</Window.BindingGroup>

this.BindingGroup.CommitEdit();
1 голос
/ 20 мая 2009

HI, Что ж, при использовании WPF нужно принять другое мышление.

Я бы в основном связал свойство Text TextBox с одним из моих свойств (Model, ViewModel, Code-Behind, что угодно, что вас радует). Поэтому, когда вы обрабатываете CTRL + S, вы просто переходите к привязанному свойству clr и продолжаете счастливо со всеми данными, которые вам нужны.

Надеюсь, что это поможет вам, если вам нужны примеры кода, оставьте мне комментарий. Ariel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...