색상을 사용하여 특정 항목을 강조 표시하는 Winform 응용 프로그램이 있습니다. 사용자가 '자신의'색을 바꿀 수있게하고 싶습니다. 연습으로 색상의 속성을 가진 클래스의 인스턴스를 만들고 속성 격자 (좋은 편집기를 얻으려고)에 할당한다고 생각했습니다..PropertyGrid는 코드에서 변경된 속성을 알지 못합니까?
이것은 잘 작동하는 것처럼 보이지만, 사용자가 색상을 재설정하도록하려는 것입니다. (20 개의 베이지 색 음영으로 설정 한 후). 그래서, 내 개체의 색상 속성을 기본값으로 다시 설정하는 "재설정"단추를 양식에 추가했습니다.
그러나 내 개체의 속성을 다시 설정하는 동안 속성 표가 변경되지 않는 것으로 보입니다. 리셋 후에 속성 격자 "새로 고침"을 수행하면 재설정 된 색상이 적용됩니다.
속성 표가 기본 개체가 변경되었음을 알 수 없다고 가정합니다.
이 시나리오에서 누락 된 것이 있습니까? 아니면 그냥 받아 들여야하며 객체를 재설정 할 때 Refresh 메서드를 호출해야합니까?
감사
(매우 비슷한 질문 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