Windows 양식 응용 프로그램에서 INotifyPropertyChanged를 트리거하는 속성 변경으로 인해 속성이 변경된 것이 아니라 바인딩 된 개체에서 모든 속성을 읽는 형식이됩니다. 아래의 예제 코드를 참조하십시오..NET WinForms INotifyPropertyChanged는 모든 바인딩이 변경되면이를 업데이트합니다. 더 좋은 방법?
인터페이스에 변경 속성의 이름이 필요하기 때문에 이것은 터무니 없게 보입니다. 일부 속성 getter는 계산을 수행해야하기 때문에 응용 프로그램에서 많은 시간을 차지하게됩니다.
내 게터에 일종의 로직을 구현하여 더 좋은 방법이 없다면 불필요한 읽기를 버릴 수도 있습니다.
나는 뭔가를 놓친가요? 더 좋은 방법이 있습니까? 다른 프리젠 테이션 기술을 사용하라고 말하지 마십시오. 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));
}
}
}
}
나는 당신이 말한 모든 것에 동의합니다. 나는 당신이 반사경에서 언급 한 코드를 발견했습니다. 답변을 답변으로 표시하려고합니다. 왜냐하면 매우 철저하므로 인정을받을 자격이 있지만, 다른 사람이 다른 대안을 제시 할 수 있다면 좋을 것입니다. 여기에 System.Windows.Forms.BindToObject의 메서드는 해당 네임 스페이스와 System.ComponentModel 사이의 경계에서 알 림 속성 정보를 삭제합니다. 훌륭한. private void PropValueChanged (개체 보낸 사람, EventArgs e) { this.bindingManager.OnCurrentChanged (EventArgs.Empty); } –
@anchandra 당신은 이렇게 말합니다. "_이 값을 사용하지 않으면 해당 컨트롤이 변경 될 때 업데이트되지 않습니다." 그냥 clearfi :'DataSourceUpdateMode'는 * Control *이 값을 데이터 소스에 푸시 다운 할 때를 결정합니다. 따라서 컨트롤은 여전히 데이터 소스 속성 변경 사항을 업데이트합니다. –