मेरे पास एक विनफॉर्म एप्लिकेशन है जो कुछ चीजों को हाइलाइट करने के लिए रंग का उपयोग करता है। मैं उपयोगकर्ताओं को 'उनके' रंग बदलने की अनुमति देना चाहता हूं। एक अभ्यास के रूप में, मैंने सोचा कि मैं रंगों के गुणों के साथ एक वर्ग का एक उदाहरण बनाउंगा, और इसे एक संपत्ति ग्रिड (एक अच्छा संपादक प्राप्त करने के लिए) असाइन करें।PropertyGrid कोड में गुणों को परिवर्तित नहीं करता है?
यह ठीक काम करता प्रतीत होता है, लेकिन मैंने सोचा कि मैं उपयोगकर्ताओं को रंगों को रीसेट करने और उन्हें बेज के 20 रंगों में सेट करने के बाद) को रीसेट करना चाहता हूं। इसलिए, मैंने अपने फॉर्म में एक "रीसेट" बटन जोड़ा, जिसने मेरी ऑब्जेक्ट के रंग गुणों को डिफ़ॉल्ट पर वापस सेट किया।
हालांकि, ऐसा लगता है कि यह मेरे ऑब्जेक्ट की गुणों को वापस सेट करता है, तो संपत्ति ग्रिड नहीं बदलती है। अगर, रीसेट के बाद, मैं एक संपत्ति ग्रिड "ताज़ा करें" करता हूं, इसमें रीसेट रंग होता है।
मुझे लगता है कि संपत्ति ग्रिड यह नहीं जानता कि अंतर्निहित वस्तु बदल दी गई है?
क्या इस परिदृश्य में कुछ याद आ रही है, या क्या मुझे इसे स्वीकार करना चाहिए और जब मैं अपना ऑब्जेक्ट रीसेट करता हूं तो रीफ्रेश विधि को कॉल करना चाहिए?
धन्यवाद
(बहुत समान प्रश्न here)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.propertyGrid1.SelectedObject = new Colours();
}
private void button1_Click(object sender, EventArgs e)
{
Colours colours = this.propertyGrid1.SelectedObject as Colours;
colours.Reset();
}
}
public partial class Colours : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Color ColourP1 { get; set; }
public void Reset()
{
this.ColourP1 = Color.Red;
var handler = this.PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs("ColourP1"));
}
}
की मेरी टिप्पणी से इसे जारी रखते हुए, subsclassing में दोष क्या "कुछ नहीं INotifyPropertyChanged.PropertyChanged का सदस्य बनता" PropertyGrid नियंत्रण इतना है कि यह करता है?
public partial class MyPropertyGrid : System.Windows.Forms.PropertyGrid
{
private INotifyPropertyChanged _selectedObject;
protected override void OnSelectedObjectsChanged(EventArgs e)
{
base.OnSelectedObjectsChanged(e);
if (_selectedObject != null) _selectedObject.PropertyChanged -= selectedObject_PropertyChanged;
_selectedObject = this.SelectedObject as INotifyPropertyChanged;
if (_selectedObject != null) _selectedObject.PropertyChanged += selectedObject_PropertyChanged;
}
private void selectedObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.Refresh();
}
}
हाँ, यह बहुत अधिक है। – LarsTech