2015-12-19 4 views
1

Чтобы создать настраиваемый элемент управления, поддерживающий простой привязку данных, я выполнил инструкции, указанные Microsoft here, и вскоре после того, как я обнаружил, что они неполны. Реализация атрибута DefaultBindingProperty недостаточно, и вам кажется, что вам нужно иметь контроль либо (i), реализуя INotifyPropertyChanged, либо выставляя событие с именем <propertyname>Changed, как описано here.Каковы ВСЕ требования для реализации простой привязки данных в UserControl?

Тем не менее, мой код (на самом деле очень упрощенная версия) здесь ниже не работает, и я борюсь за это, поскольку почти 1 день сейчас. Мой контроль:

[DefaultBindingProperty("Value")] 
public partial class MyUserControl : UserControl 
{ 
    NumericUpDown upDown; 
    public MyUserControl() 
    { 
     InitializeComponent(); 

     upDown = new NumericUpDown() { Minimum = 0, Maximum = 100, Dock = DockStyle.Fill }; 
     Controls.Add(upDown); 
     upDown.ValueChanged += control_ValueChanged; 
    } 
    [Bindable(true)] 
    public double Value 
    { 
     get { return (double)upDown.Value; } 
     set { upDown.Value = (decimal)value; } 
    } 
    private void control_ValueChanged(object sender, EventArgs e) 
    { 
     if (ValueChanged != null) 
      ValueChanged(this, e); 
    } 
    public event EventHandler<EventArgs> ValueChanged; 
} 

и мой тест форма:

public partial class Form1 : Form 
{ 
    MyUserControl myUserControl; 
    BindingSource source; 
    MyClass myClass; 
    public Form1() 
    { 
     InitializeComponent(); 

     source = new BindingSource(); 
     myClass = new MyClass() { Amount = 30 }; 
     source.DataSource = new[] { myClass }; 

     myUserControl = new MyUserControl(); 
     Controls.Add(myUserControl); 
     myUserControl.DataBindings.Add("Value", source, "Amount", false, DataSourceUpdateMode.OnPropertyChanged); 
    } 
} 

public class MyClass 
{ 
    int amount; 
    public int Amount 
    { 
     get { return amount; } 
     set 
     { 
      amount = value; 
      MessageBox.Show("New amount: " + amount); 
     } 
    } 
} 

MessageBox в конце кода не вызывается при изменении значения в NumericUpDown. Есть ли еще какая-то информация, которую мне не хватает? Что я здесь делаю неправильно?

ответ

1

Кажется, вам нужно иметь элемент управления, реализующий INotifyPropertyChanged или выставляя событие с именем < propertyName> Изменено как описано здесь.

Это параметры при реализации источника данных. Для обычая управления единственным вариантом является позже, так как управление базой уже использует этот шаблон, и реализацию INotifyPropertyChanged сломается, потому что, как указано в одном из примечаний here

Для уведомления об изменениях происходят в привязке между связанным клиентом и источником данных ваш связанный тип источника данных должен либо реализовать интерфейс INotifyPropertyChanged (предпочтительный), либо вы можете предоставить propertyName Изменены события для связанного типа, но вы не должны делать то, и другое.

Таким образом, вы правильно использовали PropertyNameChanged шаблон (или по крайней мере пытался :)

Есть ли другая часть информации, которую я не хватает? Что я здесь делаю неправильно?

Вот некоторые ссылки - Change Notification in Windows Forms Data Binding и How to: Apply the PropertyNameChanged Pattern, но то, что вам не хватает, и, к сожалению, кажется, не объясняется нигде в документации, что именно PropertyNameChanged картина, и ключевым моментом является то, что в дополнение к специально названное событие, он ожидает определенного типа этого события, а точнее, типа EventHandler. Думаю, теперь вы видите проблему - вы использовали EventHandler<EventArgs>. Подпись метода одна и та же, но то же самое можно сказать и для Action<object, EvenetArgs>. EventHandler<TEventArgs> теперь рекомендуется, помните, что он не существовал в тот момент, когда была введена привязка данных. И т.п.

Shorty, измените эту строку

public event EventHandler<EventArgs> ValueChanged; 

в

public event EventHandler ValueChanged; 

и все будет работать, как ожидалось.

+0

Да, это было большое спасибо! Я понимаю, что привязка данных ожидала «EventHandler» вместо «EventHandler », но я не могу поверить, что в Microsoft они не добавили поддержки для последнего, когда были введены общие данные! Хуже того, я не могу найти эту документацию в любом месте, и невероятно потерять более одного дня работы за небольшой недостаток, как это! –

Смежные вопросы