Как остановить привязку WPF от игнорирования события PropertyChanged, которое оно вызвало? - PullRequest
3 голосов
/ 01 мая 2009

У меня есть TextBox, связанный со свойством Text ViewModel со следующей настройкой:

Xaml

<TextBox Text="{Binding Text}"/>

C #

public class ViewModel : INotifyPropertyChanged
{
    public string Text
    {
        get
        {
            return m_Text;
        }
        set
        {
            if (String.Equals(m_Text, value))
            {
                return;
            }

            m_Text = value.ToLower();
            RaisePropertyChanged("Text");
        }
    }

    // Snip
}

Когда я набираю некоторые вещи в TextBox, он успешно устанавливает свойство Text в ViewModel. Проблема в том, что WPF игнорирует событие изменения свойства, которое вызывается его собственным обновлением. Это приводит к тому, что пользователь не видит набранный текст, преобразованный в нижний регистр.

Как я могу изменить это поведение, чтобы TextBox обновлялся строчными буквами?

Примечание: это всего лишь пример, который я использовал для иллюстрации проблемы игнорирования событий WPF. Мне не очень интересно конвертировать строки в нижний регистр или какие-либо проблемы с String.Equals (строка, строка).

Ответы [ 4 ]

2 голосов
/ 13 июля 2009

Очевидно, это исправлено в следующей версии WPF: Блог Карла Шиффлетта

2 голосов
/ 01 мая 2009

Этого можно добиться, вызвав событие в отдельном вызове диспетчера с помощью Dispatcher.BeginInvoke

Определить делегата:

private delegate void RaisePropertyChangedDelegate(string property);

Затем используйте следующее, чтобы вызвать событие

Dispatcher.CurrentDispatcher.BeginInvoke(
    DispatcherPriority.Normal,
    new RaisePropertyChangedDelegate(RaisePropertyChanged), 
    "Text");
0 голосов
/ 11 октября 2010

Необходимо принудительно обновить цель привязки (см. этот пост в MSDN ). Однако в WPF4 это было изменено / неработоспособно, поэтому вместо этого нужно принудительно обновить источник (см. в этом посте ).

0 голосов
/ 01 мая 2009

Я помню, как Роки Лхотка жаловался на такое поведение в старом эпизоде ​​.NET Rocks. (Ищет полчаса ...) ах, вот и мы. Эпизод 169 от марта 2006 г .:

Так что, если у вас есть подробная форма в Windows Forms, то вы связываете все ваши свойства для тех, кто отличается текстовые поля и пользователь печатает вещи в текстовое поле и вкладки, конечно, это значение вкладывается в ваш объект, но ваш объект может изменить значение, может быть, есть некоторые своего рода манипуляция, которая говорит все буквы должны быть в верхнем регистре. Это бизнес-правило, так что идет в вашем объект. Если вы сделаете это, он не покажет в пользовательском интерфейсе. Другими словами, пользователь можно набирать a, b, c, вводить строчные буквы, Выкл. Нижний регистр a, b, c будет остаться в текстовом поле. Потом, когда они меняют какое-то другое поле, затем они будут иметь в виду объект верхний регистр значение, верно? Итак объект имеет прописные буквы a, b, c пользовательского интерфейса неправильно показывает нижний регистр, пользователь затем меняет некоторые другие контроль и вкладки от этого элемента управления, все неожиданно a, b, c в верхнем регистре появляется в текстовом поле, что они не были включены.

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

пс. Это не дает прямого ответа на ваш вопрос, но в приведенном вами примере вы можете установить CharacterCasing в TextBox, чтобы он принимал только символы нижнего регистра.

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