Всем привет.
Есть проблема с биндингом — обнаружена была на DevExpress 9.3, но повторяется и с использованием самых обычных контролов. Описание проблемы:
Есть простая форма, на которой 2 текстбокса. Есть класс, который выступает в качестве источника данных и реализует интерфейс INotifyPropertyChanged. Т.е. когда свойство меняется — выставляем событие PropertyChanged. Каждый текстбокс привязан к одному из свойств данного класа — ничего необычного или сложного.
Ожидаемое поведение: при изменении одного свойства исходного объекта обновляется только один текстбокс, если выставляем PropertyChanged с именем = null, должны обновлятся все контролы.
Реальное поведение: при изменении одного свойства обновляются все контролы (как будто выставили PropertyChanged с именем = null), если выставляем PropertyChanged с именем = null- обновляются все контролы несколько раз (общее количество раз равно количестве биндингвов к источнику данных).
Возможно кто-то сталкивался с такими проблемами и может подсказать — как решить, либо это мегабаг фрэймворка, либо я неправильно понимаю биндинг?
Вот код (сама форма простая — два текстбокса и две кнопки)
public partial class Form1 : Form
{
TextSource textSource = new TextSource();
public Form1()
{
InitializeComponent();
Binding b = new Binding("Text", textSource, "Text1", true, DataSourceUpdateMode.OnPropertyChanged);
textBox1.DataBindings.Add(b);
textBox2.DataBindings.Add(new Binding("Text", textSource, "Text2", true, DataSourceUpdateMode.OnPropertyChanged));
}
private void button1_Click(object sender, System.EventArgs e)
{
textSource.OnPropertyChanged(string.Empty);
}
private void button2_Click(object sender, System.EventArgs e)
{
textSource.Text1 = textSource.Text1 + "Q";
}
}
public class TextSource : INotifyPropertyChanged
{
private string text1 = "Text1";
private string text2 = "Text2";
public string Text1
{
get
{
System.Diagnostics.Debug.WriteLine("TEXT1 GET");
return text1;
}
set
{
System.Diagnostics.Debug.WriteLine("TEXT1 SET");
text1 = value;
OnPropertyChanged("Text1");
}
}
public string Text2
{
get
{
System.Diagnostics.Debug.WriteLine("TEXT2 GET");
return text2;
}
set
{
System.Diagnostics.Debug.WriteLine("TEXT2 SET");
text2 = value;
OnPropertyChanged("Text2");
}
}
public TextSource()
{
}
public void OnPropertyChanged(string name)
{
if(PropertyChanged != null)
{
System.Diagnostics.Debug.WriteLine("PROPCHANGED " + name);
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}