2009-04-11 4 views
1

전 전문적인 프로그래밍에 익숙하지 않아요. C#을 쓰고 있습니다.하지만이 코드는 C#과 정확히 같지 않다고 생각합니다. 어쨌든 다양한 조건에서 여러 컨트롤 사이에서 일부 컨트롤을 사용하거나 사용하지 않도록 설정하는 가장 좋은 방법은 무엇입니까?다양한 조건에서 여러 컨트롤 사이에서 일부 컨트롤을 사용하거나 사용하지 않도록 설정하는 가장 좋은 방법은 무엇입니까?

예를 들어, 일부 행이있는 GUI가 있는데, 각각은 사람을 나타냅니다. 일부 동작을 나타내는 몇 가지 버튼이 있습니다. "스탠드, 앉아, 걷기, 점프, 먹기, TV 시청, 잠자기, 잠자기" 등의 조건이 있습니다. 누군가 앉아 있으면 TV를 볼 수 있습니다. 그 단추를 가능하게하십시오 그러나 누군가는 그가 서있을 수없는 경우에 점프 할 수 없다 (그것을 무능하게하십시오) ........ 등등. 또한 상태 변경은 버튼 클릭에만 기반하지 않습니다. 마찬가지로, 그는 잠시 후 자신을 깨우거나 말하기를 마친 것입니다.

가장 순진한 방법은 .Enabled = true/false; n 개의 상태 X m 버튼에 대해 코드를 작성하고 모든 사용자 또는 사용자가 트리거하지 않은 상태 변경을 확인하십시오. 거기에 더 나은/빠른/적은 오류가 발생하기 쉬운 방법이 있나요?

또한이 종류의 것은 무엇입니까? 나는 그것을 잘 설명하기 위해 영어로 적절한 용어를 모른다. 그래서 나는 스스로 그것을 할 수 없다 .... 제발 도와주세요. 대단히 감사합니다.

답변

2

나는, Can* (CanWalk, CanJump 등) 클래스의 속성에 Enabled 속성을 결합 INotifyPropertyChanged을 구현하고, 각 잠재적으로 영향을받는 특성 객체의 상태 변화를 확인한다.

이 방법의 장점은 Person 클래스이며 UI는 서로에 대해 알 필요가 없습니다. 또한 INotifyPropertyChanged을 구현하면 상태가 변경 될 때마다 클래스 속성의 불필요한 폴링이 제거됩니다.

복잡한 데이터 바인딩을 사용하지 않으려는 경우에도 PropertyChanged 이벤트를 수신하고 UI를 수동으로 업데이트 할 수 있습니다. 예를 들어

:

partial class Person : INotifyPropertyChanged 
{ 
    bool _IsSleeping, _IsSitting; 

    public bool IsSleeping 
    { 
     get { return _IsSleeping; } 
     set 
     { 
      if(_IsSleeping != value) 
      { 
       _IsSleeping = value; 
       OnIsSleepingChanged(); 
      } 
     } 
    } 

    public bool IsSitting 
    { 
     get { return _IsSitting; } 
     set 
     { 
      if(_IsSitting != value) 
      { 
       _IsSitting = value; 
       OnIsSittingChanged(); 
      } 
     } 
    } 

    protected virtual void OnIsSleepingChanged() 
    { 
     NotifyPropertyChanged("IsSleeping"); 
     CheckCanJumpChanged(); 
    } 

    protected virtual void OnIsSittingChanged() 
    { 
     NotifyPropertyChanged("IsSitting"); 
     CheckCanJumpChanged(); 
    } 

    bool CanJump_Old; 
    public bool CanJump { get { return !(IsSleeping || IsSitting); } } 

    void CheckCanJumpChanged() 
    { 
     if(CanJump != CanJump_Old) 
     { 
      CanJump_Old = CanJump; 
      NotifyPropertyChanged("CanJump"); 
     } 
    } 

    //INotifyPropertyChanged helper method 
    private void NotifyPropertyChanged(String prop) 
    { 
     var hand = PropertyChanged; 
     if (hand != null) 
      hand(this, new PropertyChangedEventArgs(prop)); 
    } 
} 
2

그것은 당신이 WPF 또는 윈폼을 사용하고 있는지 여부에 달려 있습니다.

WPF를 사용하면 Enabled 속성을 데이터 바인딩 할 수 있으므로 WPF를 사용하면 Enabled 속성을 데이터 바인딩 할 수 있으므로이를 활성화해야하는시기를 선언적으로 말할 수 있으며 올바른 속성 변경 이벤트가 발생하는 한 바로 발생합니다.

WinForms의 경우 예를 들어 .Enabled으로 설정하면됩니다. 가장 간단한 방법은 예를 들어 UpdateEnabled()은 규칙에 따라 모든 컨트롤에서 Enabled을 업데이트합니다 (점프하는 경우 btnEat를 비활성화해야 함). 그런 다음 상태가 변경 될 때마다 해당 메서드를 호출합니다.

모든 상태 변경이 GUI 이벤트에 응답하는 것은 아니므로 상태를 유지하고 상태가 변경 될 때마다 이벤트를 발생시키는 모델 객체가 필요할 수 있습니다. 그런 다음 해당 이벤트가 발생할 때마다 UpdateEnabled() 메서드를 호출하여 새 상태에 따라 GUI를 새로 고칠 수 있습니다.

귀하의 필요가 간단하다면 그게 전부입니다. 응용 프로그램이 더 복잡해지면 Model-View-Presenter와 같은 패턴을 조사해야합니다. Presenter는 현재 상태를 기반으로 어떤 동작이 활성화되고 어떤 동작이 중지되는지를 아는 클래스입니다.

관련 문제