В приложении формы Windows изменение свойства, которое запускает INotifyPropertyChanged, приведет к тому, что форма, считывающая свойство EVERY из моего связанного объекта, а не только свойство изменилось. (См. Пример кода ниже)
Это кажется абсурдно расточительным, поскольку для интерфейса требуется имя изменяющегося свойства. Это вызывает много часов в моем приложении, потому что некоторые из получателей свойств требуют выполнения вычислений.
Мне, вероятно, понадобится реализовать какую-то логику в моих геттерах, чтобы отбросить ненужные чтения, если нет лучшего способа сделать это.
Я что-то упустил? Есть ли способ лучше? Не говорите, чтобы использовать другую презентационную технологию, пожалуйста, я делаю это на Windows Mobile (хотя поведение происходит и в полной структуре).
Вот какой код для демонстрации проблемы. Нажатие кнопки приведет к заполнению текстовых полей BOTH даже при изменении одного свойства.
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace Example
{
public class ExView : Form
{
private Presenter _presenter = new Presenter();
public ExView()
{
this.MinimizeBox = false;
TextBox txt1 = new TextBox();
txt1.Parent = this;
txt1.Location = new Point(1, 1);
txt1.Width = this.ClientSize.Width - 10;
txt1.DataBindings.Add("Text", _presenter, "SomeText1");
TextBox txt2 = new TextBox();
txt2.Parent = this;
txt2.Location = new Point(1, 40);
txt2.Width = this.ClientSize.Width - 10;
txt2.DataBindings.Add("Text", _presenter, "SomeText2");
Button but = new Button();
but.Parent = this;
but.Location = new Point(1, 80);
but.Click +=new EventHandler(but_Click);
}
void but_Click(object sender, EventArgs e)
{
_presenter.SomeText1 = "some text 1";
}
}
public class Presenter : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _SomeText1 = string.Empty;
public string SomeText1
{
get
{
return _SomeText1;
}
set
{
_SomeText1 = value;
_SomeText2 = value; // <-- To demonstrate that both properties are read
OnPropertyChanged("SomeText1");
}
}
private string _SomeText2 = string.Empty;
public string SomeText2
{
get
{
return _SomeText2;
}
set
{
_SomeText2 = value;
OnPropertyChanged("SomeText2");
}
}
private void OnPropertyChanged(string PropertyName)
{
PropertyChangedEventHandler temp = PropertyChanged;
if (temp != null)
{
temp(this, new PropertyChangedEventArgs(PropertyName));
}
}
}
}