0

응용 프로그램의 속성 값 중 하나가 변경 될 때 반응하는 사용자 지정 단추를 사용해야합니다.속성 변경 이벤트를 사용자 지정 컨트롤에 추가

다음
public class ButtonData 
{ 
    public string Name; 
    public string Color; 
    //And more stuff... 
} 

나는, 나는 될 때마다 Data 건물 자체 (변경 배경 색상과 다른 물건)을 업데이트 할 수있는 새로운 버튼의 folowing 코드 싶지 않은 : 나는 새로운 버튼 Data라는 이름의 필드를 CH3OH 응용 프로그램의 어딘가에서 업데이트됩니다. 나는 INotifyPropertyChanged 인터페이스를 구현하는 방법에 대한 몇 가지 아이디어를 발견하고 나는이 같은 내 사용자 정의 버튼에 설정 :

public partial class ButtonPin : Button, INotifyPropertyChanged 
{ 
    private ButtonData _data; 

    public ButtonData Data 
    { 
     get { return _data; } 
     set 
     { 
      if (value == _data) return; 
      _data = value; 
      OnPropertyChanged("Data"); 
     } 
    } 
    private bool _buttonDataAdded; 


    public ButtonPin() 
    { 
     InitializeComponent(); 
    } 

    public ButtonPin(ButtonData data) 
    { 
     Data = data; 
     _buttonDataAdded = true; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    } 

지금 내가 이것을 사용하는 방법을 잘 모르겠습니다! 예를 들어 Data 개체의 색이 어딘가에서 으로 변경되고 현재 단추의 데이터 필드에 할당되면이 단추의 배경색을 변경해야합니다.

var data = new ButtonData(); 
data.Name = "Hi!"; 
data.Color = Color.Red; 

buttonPin1.Data = data; //Here I need the changes to occur 

답변

1

같은 뭔가 당신은하지 ButtonData 클래스에서 ButtonPin 클래스에서에서 INotifyPropertyChanged 인터페이스를 구현 한, 당신은 유형 ButtonData의 객체에 변화를 감지 할, 그래서 당신은에에서 INotifyPropertyChanged 인터페이스를 구현해야 ButtonData 클래스

변경 사항을 감지하려면 ButtonPin.Data 속성의 setter에서 ButtonData 개체의 PropertyChanged 이벤트에 연결해야합니다. 이 같은.

private bool _data; 
public ButtonData Data { 
    get { return _data; } 
    set { 
     if (value != _data) { 
      // Unhook previous events 
      if (_data != null) 
       _data.PropertyChanged -= HandleButtonDataPropertyChanged; 
      // Set private field 
      _data = value; 
      // Hook new events 
      if (_data != null) 
       _data.PropertyChanged += HandleButtonDataPropertyChanged; 
      // Immediate update since we have a new ButtonData object 
      if (_data != null) 
       Update(); 
     } 
    } 
} 

private void HandleButtonDataPropertyChanged(object sender, PropertyChangedEventArgs e) { 
    // Handle change in ButtonData 
    Update(); 
} 

private void Update() { 
    // Update... 
} 
+0

흠''Data' 개체가'Button'에 할당 된 후에 업데이트를 원합니다. 동일합니까?! –

+0

새로운 ButtonData 객체가 있으므로 명시 적으로 버튼을 업데이트하려면 private 필드가 설정된 후에 Update() 메서드가 호출됩니다. property changed 이벤트는, ButtonData object의 설정 후에 변경을 처리하는 것입니다. – Maarten

관련 문제