Почему Winforms.Button.Text работает для DataBinding, но не для ImageKey?

2

Есть ли кто-нибудь, кто это знает?

Я пробовал это на прошлой неделе, и не повезло.

Теперь я вижу, что однажды можно успешно привязать свойство Button Text, но не его свойство ImageKey:

myButton.Text = "new text"; // really changes the bound data
myButton.ImageKey = "new text"; // does NOT change the bound data

Я использую:

myButton.DataBindings.Add ( new Binding ( "ImageKey", this.MyData, "Name", true, DataSourceUpdateMode.OnPropertyChanged ) );

Почему? Что заставляет Binding тикать/работать? Я просто не понимаю.

EDIT:

ОК, поэтому я определил их для своего собственного производного элемента управления:

public event EventHandler ImageKeyChanged;

protected virtual void OnImageKeyChanged ( EventArgs e )
{
    if ( ImageKeyChanged!= null )
    {
        ImageKeyChanged ( this, e );
    }
}

[Bindable ( true )]
public new string ImageKey
{
    get
    {
        return base.ImageKey;
    }
    set
    {
        base.ImageKey = value;
        this.OnImageKeyChanged ( EventArgs.Empty );
    }
}

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

Теги:
winforms
data-binding

2 ответа

3
Лучший ответ

... НЕ изменяет связанные данные

для двусторонней привязки, вам нужны события уведомлений - это может принимать две распространенные формы:

  • a public event EventHandler {name}Changed;, где {name} - связанное свойство (ImageKeyChanged, например)
  • объект может реализовать INotifyPropertyChanged

Это, безусловно, работает с привязкой к объекту; Я почти уверен, что обнаружение контроля над объектом очень похоже. Обратите внимание, что есть событие TextChanged, но не событие ImageKeyChanged.

  • 0
    Спасибо Марк. Я реализовал событие, а также имел INotifyPropertyChanged для объекта, который был связан ранее. Но все так же. Я должен что-то упустить.
  • 0
    На самом деле я думаю, что это сработало. Я всегда имею это в конце дня, проверю на другую собственность.
Показать ещё 2 комментария
2

Для привязки к работе класс с привязываемым свойством должен предоставлять события изменения (TextChanged для свойства Text) или реализовать INotifyPropertyChanged. Поскольку класс Button не предоставляет событие ImageKeyChanged, привязка не может подписаться на получение уведомления об изменении.

  • 0
    Спасибо, Лусеро, я думаю, у меня все получилось. Спасибо тебе и Марку. Я хочу принять оба ответа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню