관리 가능한 커밋 방법을 작성합니다
-
05-07-2019 - |
문제
옵션 대화 상자에서 편집되는 일부 속성을 캡슐화하는 뷰 모델이 있습니다. 그들이 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();
}
}
다른 팁
반사를 사용하여 클래스가 가지고있는 속성을 결정하고 반복 할 수 있습니까?
제휴하지 않습니다 StackOverflow