문제

옵션 대화 상자에서 편집되는 일부 속성을 캡슐화하는 뷰 모델이 있습니다. 그들이 OK 버튼을 누르기 전까지는 설정에 실제로 저장할 수 없으며,이 특정 뷰 모델에서 커밋을 호출하게됩니다.

내 뷰 모델의 단일 속성은 다음과 같습니다.

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 Method가 해당 이벤트를 제기하고 각 속성에 대한 코드가 이벤트에 대한 이벤트 핸들러를 추가하고 거기에 설정에 글을 작성하도록 할 수 있다고 생각했지만 모르겠습니다. 어쨌든 생성자에 이벤트 처리기를 추가하지 않고 그렇게하는 방법은 상황에 도움이되지 않습니다.

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

편집하다: 답변에 대해 SixTervariables에 감사드립니다. 나는 그 아이디어를 가져 와서 그것을 통합했다 비누 상자 코어 그리고 개방형 결과를 얻었습니다. 옵션 대화 상자를 확인하여 작동 방식을 확인하십시오.

도움이 되었습니까?

해결책

아마도 목록을 유지할 수 있습니다 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();
    }
}

다른 팁

반사를 사용하여 클래스가 가지고있는 속성을 결정하고 반복 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top