Как я могу пометить форму/поле как грязное, если оно привязано к данным?

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


person Mark Carpenter    schedule 10.03.2009    source источник


Ответы (4)


попробуй реализовать

public partial class Window1 : INotifyPropertyChanged

а потом

public event PropertyChangedEventHandler PropertyChanged;

public string UserName
{
    get { return _UserName; }
    set { if (value != _UserName)
    {
        _UserName = value;
        OnNotifyPropertyChanged("UserName");
    }}
}

private void OnNotifyPropertyChanged(string property)
{
  if (PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs(property));
}

и привязка данных, как

<TextBox Text="{Binding UserName}"/>
person Jon Masters    schedule 25.04.2009
comment
Очень незначительное улучшение: вы можете уменьшить вложенность, сделав вместо этого: if (value == _UserName) return; Немного уменьшает визуальный беспорядок. - person Josh Kodroff; 25.04.2009

Реализует ли ваш класс модели INotifyPropertyChanged? Если это так, вы можете добавить обработчик события PropertyChanged в класс и наблюдать за изменением рассматриваемого свойства.

Если вы не реализовали INotifyPropertyChanged, может быть, механизм, который вы используете для уведомления уровня пользовательского интерфейса об обновлениях, можно было бы использовать и здесь?

person Andy    schedule 10.03.2009

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

person SeanJA    schedule 10.03.2009

--> http://www.mishainthecloud.com/2009/07/simple-dirty-tracking-for-winforms-in-c.html.

Я знаю, что это немного поздно, но мне нравится такой подход :) Инкапсулированное совершенство.

После привязки элементов управления вызовите SetAsClean(). Вызов этого метода, вероятно, можно было бы инкапсулировать в том же классе грязного отслеживания, обрабатывая некоторые события BindingSources.

person br3nt    schedule 21.05.2012
comment
Не думайте, что это относится к WPF. - person Dave Lucre; 16.12.2013