Связанный UserControl не обновляет источник данных - PullRequest
2 голосов
/ 12 января 2012

У меня есть UserControl, в котором есть текстовое поле, кнопка и элементы управления всплывающей подсказки.Он реализует INotifyPropertyChanged Я пытался переопределить свойство Text и добавить свое собственное свойство, но во всех случаях элемент управления читает из связанного источника данных нормально, но никогда не обновляет источник данных.Мои события возникают при изменении текста.Часть кода ниже.Все остальные стандартные элементы управления работают нормально.Что мне нужно, чтобы получить элемент управления для обновления источника данных, когда пользователь ввел или изменил значение?

public partial class UrlControl : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [Bindable(true)]
    [Browsable(true)]
    public string Url
    {
        get
        {
            return url.Text;
        }
        set
        {
            if (value != url.Text)
            {
                url.Text = value;
                OnPropertyChanged("Url");
            }
        }
    }
    protected virtual void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }

Это код привязки от дизайнера форм.

this.urlControl1.DataBindings.Add(new System.Windows.Forms.Binding("Url", this.customerBindingSource, "First", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

}

Ответы [ 2 ]

4 голосов
/ 12 января 2012

INotifyPropertyChanged для источников данных. Это позволяет вашему источнику данных уведомлять связанные элементы управления и других слушателей об изменениях свойств. Однако сами органы управления используют другой механизм. Это немного странно: вы создаете события на вашем контроле с соглашением об именах <PropertyName>Changed. Когда значение свойства изменяется, вы вызываете соответствующее событие.

Пример:

public string Url
{
    get { return url.Text; }
    set 
    { 
        if (value != url.Text) 
        { 
            url.Text = value; 
            OnUrlChanged(); // raise event
        }
    }
}

public event EventHandler UrlChanged;

private void OnUrlChanged()
{
    // raise the UrlChanged event
    if (UrlChanged != null)
        UrlChanged(this, new EventArgs());
}

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

Вот тема на MSDN: Как: применить шаблон PropertyNameChanged

1 голос
/ 12 января 2012

Это должно хорошо работать для чтения значений из источника данных.

Однако, когда дело доходит до записи значений в источник данных, похоже, что вы сохраняете и получаете значение Url непосредственно из url текстовое окно.Однако при изменении текста в пользовательском интерфейсе текстовое поле не отображается.Чтобы исправить это, добавьте в текстовое поле обработчик события TextChanged, который может просто вызвать:

void url_TextChanged(object sender, EventArgs e)
{
    OnPropertyChanged("Url");
    OnUrlChanged(); // See additional note below
}

В качестве стороны, хотя реализация INotifyPropertyChanged должна работать ... Когда это произойдетк привязке Windows Forms вы также можете создать событие с именем свойства с суффиксом «Изменено», и привязка должна следить за тем, чтобы:

public event EventHandler UrlChanged;

protected virtual void OnUrlChanged()
{
    var handler = UrlChanged;
    if (handler != null)
    {
        handler(this, EventArgs.Empty);
    }
}

[Bindable(true)]
[Browsable(true)]
public string Url
{
    get
    {
        return url.Text;
    }
    set
    {
        if (value != url.Text)
        {
            url.Text = value;
            OnPropertyChanged("Url");
            OnUrlChanged();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...