Tôi có một ứng dụng Winform sử dụng màu sắc để làm nổi bật những thứ nhất định. Tôi muốn cho phép người dùng thay đổi màu 'của họ'. Như một bài tập, tôi nghĩ rằng tôi sẽ tạo ra một thể hiện của một lớp, với các thuộc tính cho màu sắc, và gán nó vào một lưới thuộc tính (để có được một trình soạn thảo đẹp).PropertyGrid không nhận thấy các thuộc tính thay đổi trong mã?
Điều này có vẻ hoạt động tốt, nhưng sau đó tôi nghĩ rằng tôi muốn cho phép người dùng đặt lại màu (sau khi họ đã không sử dụng và đặt chúng thành 20 màu be). Vì vậy, tôi đã thêm nút "đặt lại" vào biểu mẫu của tôi, đặt thuộc tính màu của đối tượng của tôi về giá trị mặc định.
Tuy nhiên, có vẻ như trong khi nó đặt thuộc tính của đối tượng của tôi trở lại, lưới thuộc tính không thay đổi. Nếu, sau khi đặt lại, tôi làm lưới thuộc tính "Làm mới", nó có màu thiết lập lại.
Tôi giả định rằng lưới thuộc tính không biết rằng đối tượng cơ bản đã bị thay đổi?
Có điều gì thiếu trong trường hợp này hay tôi chỉ chấp nhận và gọi phương thức Làm mới khi đặt lại đối tượng của mình?
Cảm ơn
(rất giống câu hỏi 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"));
}
}
Sau ngày từ bình luận của tôi về "không có gì đặt mua các INotifyPropertyChanged.PropertyChanged", nhược điểm trong subsclassing là những gì điều khiển PropertyGrid sao cho nó hoạt động?
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();
}
}
Vâng, có khá nhiều tiền. – LarsTech