В приложении Windows Form изменение свойства, которое вызывает INotifyPropertyChanged, приведет к тому, что форма будет читать КАЖДОЕ свойство из моего связанного объекта, а не только измененное свойство. (См. Пример кода ниже)
Это кажется абсурдно расточительным, поскольку для интерфейса требуется имя изменяемого свойства. Это вызывает много тактирования в моем приложении, потому что некоторые из методов получения свойств требуют выполнения вычислений.
Мне, вероятно, потребуется реализовать какую-то логику в моих геттерах, чтобы отбросить ненужные операции чтения, если нет лучшего способа сделать это.
Я что-то упустил? Есть ли способ лучше? Не говорите, чтобы использовать другую технологию представления, пожалуйста - я делаю это на Windows Mobile (хотя поведение происходит и на полной основе).
Вот некоторый игрушечный код, чтобы продемонстрировать проблему. Нажатие на кнопку приведет к заполнению ОБА текстовых полей, даже если одно свойство изменилось.
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));
}
}
}
}