Trong ứng dụng biểu mẫu cửa sổ, thay đổi thuộc tính kích hoạt INotifyPropertyChanged, sẽ dẫn đến biểu mẫu đọc EVERY thuộc tính từ đối tượng bị ràng buộc của tôi, không chỉ là thuộc tính đã thay đổi. (Xem mã ví dụ bên dưới).NET WinForms INotifyPropertyChanged cập nhật tất cả các ràng buộc khi một thay đổi. Cách tốt hơn?
Điều này có vẻ vô lý lãng phí vì giao diện yêu cầu tên của thuộc tính thay đổi. Nó đang gây ra rất nhiều thời gian trong ứng dụng của tôi vì một số getters thuộc tính yêu cầu tính toán được thực hiện.
Tôi có thể cần phải triển khai một số loại logic trong getters của mình để loại bỏ các lần đọc không cần thiết nếu không có cách nào tốt hơn để thực hiện việc này.
Tôi có thiếu gì đó không? Có cách nào tốt hơn? Đừng nói để sử dụng một công nghệ trình bày khác nhau xin vui lòng - Tôi đang làm điều này trên Windows Mobile (mặc dù hành vi xảy ra trên khuôn khổ đầy đủ là tốt).
Dưới đây là một số mã đồ chơi để chứng minh sự cố. Nhấp vào nút sẽ dẫn đến BOTH hộp văn bản được phổ biến ngay cả khi một thuộc tính đã thay đổi.
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));
}
}
}
}
Tôi đồng ý với mọi thứ bạn đã nói, tôi đã tìm thấy mã bạn đã đề cập trong Trình phản chiếu. Tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời vì nó rất kỹ lưỡng và bạn xứng đáng được công nhận, tuy nhiên, sẽ tuyệt vời nếu bất kỳ ai khác thấy điều này có thể cung cấp các giải pháp thay thế bổ sung. BTW, đây là phương thức trong System.Windows.Forms.BindToObject để giảm thông tin thuộc tính notifcation ngay tại ranh giới giữa không gian tên đó và System.ComponentModel. Rực rỡ. riêng void PropValueChanged (đối tượng người gửi, EventArgs e) { this.bindingManager.OnCurrentChanged (EventArgs.Empty); } –
@anchandra bạn nói: "_Khi giá trị này được đặt thành Không bao giờ, điều khiển tương ứng sẽ không cập nhật khi có thay đổi_". Chỉ để clearfi: 'DataSourceUpdateMode' xác định khi * Control * đẩy giá trị vào nguồn dữ liệu. Vì vậy, điều khiển sẽ vẫn cập nhật sau đó thay đổi thuộc tính nguồn dữ liệu. –