विंडोज़ फॉर्म एप्लिकेशन में, एक संपत्ति परिवर्तन जो INotifyPropertyChanged को ट्रिगर करता है, परिणामस्वरूप मेरे बाध्य ऑब्जेक्ट से प्रत्येक संपत्ति को पढ़ने का फॉर्म होगा, न केवल संपत्ति बदल दी जाएगी। (नीचे उदाहरण कोड देखें).NET WinForms InotifyProperty चेंज किए गए सभी बाइंडिंग अपडेट करते हैं जब कोई बदल जाता है। बेहतर तरीका?
यह बेहद अपर्याप्त लगता है क्योंकि इंटरफ़ेस को बदलती संपत्ति का नाम चाहिए। यह मेरे ऐप में बहुत सी घड़ी का कारण बन रहा है क्योंकि कुछ संपत्ति प्राप्तकर्ताओं को गणना करने की आवश्यकता होती है।
यदि मुझे ऐसा करने का कोई बेहतर तरीका नहीं है तो मुझे अनावश्यक पढ़ने को त्यागने के लिए मेरे गेटर्स में कुछ प्रकार के तर्क लागू करने की आवश्यकता होगी।
क्या मुझे कुछ याद आ रही है? क्या कोई बेहतर तरीका है? कृपया एक अलग प्रस्तुति तकनीक का उपयोग करने के लिए मत कहें - मैं इसे विंडोज मोबाइल पर कर रहा हूं (हालांकि व्यवहार पूरी ढांचे पर भी होता है)।
समस्या का प्रदर्शन करने के लिए यहां कुछ खिलौना कोड है। बटन पर क्लिक करने से दोनों संपत्तियों में बदलाव होने के बावजूद दोनों टेक्स्टबॉक्स पॉप्युलेट हो जाएंगे।
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));
}
}
}
}
मैं आपके द्वारा जो कुछ भी कहा है उससे सहमत हूं, मैंने आपके द्वारा उल्लिखित कोड को प्रतिबिंबित किया है। मैं आपकी प्रतिक्रिया को उत्तर के रूप में चिह्नित करने जा रहा हूं क्योंकि यह बहुत गहन है और आप मान्यता के लायक हैं, हालांकि, यह अच्छा होगा अगर कोई और जो इसे देखता है तो अतिरिक्त विकल्प प्रदान कर सकता है। बीटीडब्लू, यहां सिस्टम.Windows.Forms.BindToObject में विधि है जो उस नामस्थान और सिस्टम के बीच की सीमा पर अधिसूचना संपत्ति की जानकारी को छोड़ देता है। कॉम्पोनेंट मॉडल। प्रतिभाशाली। निजी शून्य PropValueChanged (ऑब्जेक्ट प्रेषक, EventArgs ई) { this.bindingManager.OnCurrentChanged (EventArgs.Empty); } –
@anchandra आप कहते हैं: "_ जब यह मान कभी भी सेट नहीं होता है, तो जब कोई परिवर्तन होता है तो संबंधित नियंत्रण अपडेट नहीं होगा"। बस clearfi: 'DataSourceUpdateMode' निर्धारक जब * नियंत्रण * डेटा स्रोत में मान को धक्का देता है। तो नियंत्रण अभी भी डेटास्रोत संपत्ति परिवर्तन के बाद अद्यतन होगा। –