2009-10-21 4 views
2

옵션 대화 상자에서 편집중인 일부 속성을 캡슐화하는 ViewModel이 있습니다. Ok 버튼을 누를 때까지 실제로 설정에 저장할 수 없기 때문에이 특정 ViewModel에서 Commit을 호출하게됩니다.유지 보수 가능한 커밋 메소드 작성하기

내 뷰 모델에서 하나의 속성은 다음과 같습니다

public bool SomeProperty 
{ 
    get 
    { 
     return m_SomeProperty; 
    } 
    set 
    { 
     if (m_SomeProperty != value) 
     { 
      m_SomeProperty = value; 
      NotifyPropertyChanged("SomeProperty"); 
     } 
    } 
} 
private bool m_SomeProperty = Properties.Settings.Default.SomeProperty; 

그래서 커밋에 대한 일반적인 구현은 할 것 :

public void Commit() 
{ 
    Properties.Settings.Default.SomeProperty = m_SomeProperty; 
    // Add other properties here... 
} 

이 그렇게 나쁘지는 않지만 이유 나는 이것이 새로운 속성을 추가하면 두 곳에서 코드를 추가해야한다는 것을 싫어한다. 나는 가능한 한 피하려고 노력한다.

처음에는 OnCommit라는 개인 이벤트를 선언하고 Commit 메서드가 해당 이벤트를 발생시키고 각 속성에 대한 코드가 있어야 이벤트에 대한 이벤트 처리기를 추가하고 설정에 대한 쓰기 작업을 수행 할 수 있다고 생각했지만 어쨌든 생성자에서 이벤트 처리기를 추가하지 않고이를 수행하는 방법을 알지 못한다면 상황을 해결하지 못합니다.

아이디어가 있으십니까? 누구든지 내가하려는 일을하는 우아한 방법이 있니?

수정 : 대답은 6 개 변수가 있습니다. 나는 그 아이디어를 가지고 SoapBox Core에 통합 시켰고 그 결과를 공개했다. 옵션 대화 상자가 어떻게 작동하는지 확인하십시오.

답변

4

Action의 목록을 유지 관리 하시겠습니까?

private List<Action> commitActions = new List<Action>(); 

public bool SomeProperty 
{ 
    get 
    { 
     return m_SomeProperty; 
    } 
    set 
    { 
     if (m_SomeProperty != value) 
     { 
      m_SomeProperty = value; 
      lock (commitActions) 
      { 
       commitActions.Add(
        () => Properties.Settings.Default.SomeProperty = value); 
      } 
      NotifyPropertyChanged("SomeProperty"); 
     } 
    } 
} 

그런 다음 Commit 코드를 업데이트하여 작업을 반복하십시오.

public void Commit() 
{ 
    List<Action> commits; 
    lock (commitActions) 
    { 
     commits = new List<Action>(commitActions); 
     commitActions.Clear(); 
    } 

    foreach (var commit in commits) 
    { 
     commit(); 
    } 
} 
+0

+1 이것은 나에게 가장 좋은 방법 같아 보입니다. –

+0

이것은 매우 멋진 아이디어입니다. 취소 된 작업에 대해서도 (저장된 값으로 다시 설정하기 위해) 취소 작업이 필요하다는 것을 알게되었습니다. 그래도 GUI에서 액세스하는 경우 자물쇠가 필요합니까? –

+0

정말로 'commitActions'에 액세스하는 스레드가 하나 뿐인 경우에는 잠금이 필요하지 않습니다. 코드가 더 복잡해지면 잠금 장치가 제안되었습니다. 또한, 실행 취소 및 재실행을위한'Action'을 포함하는 자신만의 Undo/Redo 클래스를 만들 수 있습니다. – user7116

0

리플렉션을 사용하여 클래스에있는 속성을 확인하고 반복 할 수 있습니까?

+0

확실하지 않습니다. 어쩌면 어떤 종류의 람다 함수와 쌍을 이루면 ... –

관련 문제