Всем привет!
Такая ситуация. Есть объект данных, реализует интерфейс INotifyPropertyChanged. забиндил его стандартным биндингом на контролы (текст-боксы)на форме. всё работает. При изменении значения в контроле, при переходе по таб на следующий контрол, новое значение из контрола присваивается в соответствующую проперть объекта (что верно), но:
1. после генерации объектом-данных события об изменении этого проперти, все остальные контролы на форме забинденные на этот объект но на другие свойства перечитывают их значения. нафига? ведь никто не говорил что они изменились, зачем им перечитывать из объекта-данных? хотя при изменении этого проперти программно, всё корректно — перечитывается токо измененное свойство (событие об котором сгенерилось), остальные не перечитываются.
2. если в сетере происходит какая-либо модификация присваиваемого свойству значения (так определено например бизнес-логикой объекта-данных), то реально присвоенное значение не отражается в контроле. почему? событие об изменении этогоже генериться?
Здравствуйте, saneman1, Вы писали:
S>Всем привет! S>Такая ситуация. Есть объект данных, реализует интерфейс INotifyPropertyChanged. забиндил его стандартным биндингом на контролы (текст-боксы)на форме. всё работает. При изменении значения в контроле, при переходе по таб на следующий контрол, новое значение из контрола присваивается в соответствующую проперть объекта (что верно), но:
S>1. после генерации объектом-данных события об изменении этого проперти, все остальные контролы на форме забинденные на этот объект но на другие свойства перечитывают их значения. нафига? ведь никто не говорил что они изменились, зачем им перечитывать из объекта-данных? хотя при изменении этого проперти программно, всё корректно — перечитывается токо измененное свойство (событие об котором сгенерилось), остальные не перечитываются.
Это очень странно. Если свойство в объекте-данных изменяется из контрола, то на событие вообще не должно быть реакции, не то, что уж поголовная перечитка свойств.
S>2. если в сетере происходит какая-либо модификация присваиваемого свойству значения (так определено например бизнес-логикой объекта-данных), то реально присвоенное значение не отражается в контроле. почему? событие об изменении этогоже генериться?
И снова странно.
S>Заранее всем спасибо за ответы по теме...
К сожалению, мало чем могу помочь, потому что много загадочного. Сможешь привести маленький пример?
Здравствуйте, MxKazan, Вы писали:
MK>Это очень странно. Если свойство в объекте-данных изменяется из контрола, то на событие вообще не должно быть реакции, не то, что уж поголовная перечитка свойств.
и тем не менее это так
MK>К сожалению, мало чем могу помочь, потому что много загадочного. Сможешь привести маленький пример?
вот, с коментариями (для проверки можно скопипастить в код формы на которой есть два текстбокса: textBox1 и textBox2) :
public partial class Form1 : Form
{
private BindingSource bindingSource1 = new BindingSource();
private TestDataObject test1 = null;
public Form1()
{
InitializeComponent();
test1 = new TestDataObject { Prop1 = 1, Prop2 = 2 };
Bind(); //после этого текстбоксы как и ожидалось корректно показывают данные, 1 и 2 соответственно
}
private void Bind()
{
bindingSource1.DataSource = test1;
textBox1.DataBindings.Add("Text", bindingSource1, "Prop1", true);
textBox2.DataBindings.Add("Text", bindingSource1, "Prop2", true);
}
class TestDataObject : INotifyPropertyChanged
{
private int? _prop1;
public int? Prop1
{
get { return _prop1; }
set
{
//когда из текстбокс1 присваивается сюда "магическое" число 5,
// ( после перехода с него табом на другой контрол ( не текстбокс2)
// то текстбокс2 сразу же отображает 6 (хотя свойство2 не менялось и события об его изменении не было)
// как показало хождение под отладкой, после генерации события об изменении свойства1, мы попадаем в
// получение заначения свойства2 ?????if (value == 5)
_prop2 = 6;
//когда из текстбокс1 присваивается сюда "магическое" число 6,
// ( после перехода с него табом на другой контрол ( не текстбокс2)
// то текстбокс1 не отображает реально присвоенное значение 7 (хотя событие об его изменении сгенерилось)
// как показало хождение под отладкой, после генерации события об изменении свойства1, мы Не попадаем в
// получение заначения свойства1 ????if (value == 6)
value = 7;
_prop1 = value;
FirePropertyChanged("Prop1");
}
}
int? _prop2;
public int? Prop2
{
get { return _prop2; }
set
{
_prop2 = value;
FirePropertyChanged("Prop2");
}
}
void FirePropertyChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
какие мысли у уважаемой общественности по поводу этого безобразия ? ...
S> public partial class Form1 : Form
S> {
S> private BindingSource bindingSource1 = new BindingSource();
S> private TestDataObject test1 = null;
S> public Form1()
S> {
S> InitializeComponent();
S> test1 = new TestDataObject { Prop1 = 1, Prop2 = 2 };
S> Bind(); //после этого текстбоксы как и ожидалось корректно показывают данные, 1 и 2 соответственно
S> }
S> private void Bind()
S> {
S> bindingSource1.DataSource = test1;
S> textBox1.DataBindings.Add("Text", bindingSource1, "Prop1", true);
S> textBox2.DataBindings.Add("Text", bindingSource1, "Prop2", true);
S> }
S> class TestDataObject : INotifyPropertyChanged
S> {
S> private int? _prop1;
S> public int? Prop1
S> {
S> get { return _prop1; }
S> set
S> {
S> //когда из текстбокс1 присваивается сюда "магическое" число 5,
S> // ( после перехода с него табом на другой контрол ( не текстбокс2)
S> // то текстбокс2 сразу же отображает 6 (хотя свойство2 не менялось и события об его изменении не было)
S> // как показало хождение под отладкой, после генерации события об изменении свойства1, мы попадаем в
S> // получение заначения свойства2 ?????
S> if (value == 5)
S> _prop2 = 6;
S> //когда из текстбокс1 присваивается сюда "магическое" число 6,
S> // ( после перехода с него табом на другой контрол ( не текстбокс2)
S> // то текстбокс1 не отображает реально присвоенное значение 7 (хотя событие об его изменении сгенерилось)
S> // как показало хождение под отладкой, после генерации события об изменении свойства1, мы Не попадаем в
S> // получение заначения свойства1 ????
S> if (value == 6)
S> value = 7;
S> _prop1 = value;
S> FirePropertyChanged("Prop1");
S> }
S> }
S> int? _prop2;
S> public int? Prop2
S> {
S> get { return _prop2; }
S> set
S> {
S> _prop2 = value;
S> FirePropertyChanged("Prop2");
S> }
S> }
S> void FirePropertyChanged(string propName)
S> {
S> if (PropertyChanged != null)
S> PropertyChanged(this, new PropertyChangedEventArgs(propName));
S> }
S> public event PropertyChangedEventHandler PropertyChanged;
S> }
S> }
S>
S>какие мысли у уважаемой общественности по поводу этого безобразия ? ...
Здравствуйте, saneman1, Вы писали:
S>Здравствуйте, MxKazan, Вы писали:
S>вот, с коментариями (для проверки можно скопипастить в код формы на которой есть два текстбокса: textBox1 и textBox2) :
S>[c#] S> public partial class Form1 : Form S> { S> private BindingSource bindingSource1 = new BindingSource(); S> private TestDataObject test1 = null;
S> public Form1() S> { S> InitializeComponent(); S> test1 = new TestDataObject { Prop1 = 1, Prop2 = 2 }; S> Bind(); //после этого текстбоксы как и ожидалось корректно показывают данные, 1 и 2 соответственно S> }
S> private void Bind() S> { S> textBox1.DataBindings.Add("Text", test1, "Prop1", true); S> textBox2.DataBindings.Add("Text", test1, "Prop2", true); S> }
А попробуйте без bindingSource1, я поправил в цитате.
Здравствуйте, sto, Вы писали:
sto>Здравствуйте, saneman1, Вы писали:
S>>Здравствуйте, MxKazan, Вы писали:
S>>вот, с коментариями (для проверки можно скопипастить в код формы на которой есть два текстбокса: textBox1 и textBox2) :
S>>
S>> public partial class Form1 : Form
S>> {
S>> private BindingSource bindingSource1 = new BindingSource();
S>> private TestDataObject test1 = null;
S>> public Form1()
S>> {
S>> InitializeComponent();
S>> test1 = new TestDataObject { Prop1 = 1, Prop2 = 2 };
S>> Bind(); //после этого текстбоксы как и ожидалось корректно показывают данные, 1 и 2 соответственно
S>> }
S>> private void Bind()
S>> {
S>> textBox1.DataBindings.Add("Text", test1, "Prop1");
S>> textBox2.DataBindings.Add("Text", test1, "Prop2");
S>> }
S>>
sto>А попробуйте без bindingSource1, я поправил в цитате.
Блин, форматирование поехало...
И попробуйте перегрузку DataBindings.Add() без последнего параметра.
formattingEnabled нужен, если вы задаете строку формата для биндинга, а у вас этого нет.
sto>>А попробуйте без bindingSource1, я поправил в цитате.
пробовал, это ничего не меняет в вышеозвученном поведении.
sto>И попробуйте перегрузку DataBindings.Add() без последнего параметра. sto>formattingEnabled нужен, если вы задаете строку формата для биндинга, а у вас этого нет.
пробовал без этого изменённое в текстбоксе значение не присваивается биндингом в источник данных (но для строковых свойств присваивается), поэтому в данном примере formattingEnabled нужен.
Здравствуйте, Codechanger, Вы писали:
C>Код написан безобразно, какие уж тут мысли
ну во первых это всего лишь пример для илюстрации проблемы
а что именно безобразно ?...
Здравствуйте, saneman1, Вы писали:
S>Здравствуйте, Codechanger, Вы писали:
C>>Код написан безобразно, какие уж тут мысли S>ну во первых это всего лишь пример для илюстрации проблемы S>а что именно безобразно ?...
public int? Prop1 S> { S> get { return _prop1; } S> set S> { S> //когда из текстбокс1 присваивается сюда "магическое" число 5, S> // ( после перехода с него табом на другой контрол ( не текстбокс2) S> // то текстбокс2 сразу же отображает 6 (хотя свойство2 не менялось и события об его изменении не было) S> // как показало хождение под отладкой, после генерации события об изменении свойства1, мы попадаем в S> // получение заначения свойства2 ????? S> if (value == 5) S> _prop2 = 6;
S> //когда из текстбокс1 присваивается сюда "магическое" число 6, S> // ( после перехода с него табом на другой контрол ( не текстбокс2) S> // то текстбокс1 не отображает реально присвоенное значение 7 (хотя событие об его изменении сгенерилось) S> // как показало хождение под отладкой, после генерации события об изменении свойства1, мы Не попадаем в S> // получение заначения свойства1 ???? S> if (value == 6) S> value = 7;
S> _prop1 = value; S> FirePropertyChanged("Prop1"); S> }