상태 관리를 속성 변경 알림과 함께 사용하려는 것처럼 들립니다. 국가 관리는 당신이 원하는 것을 어떻게 할 것인가에 달려 있습니다. 의미있는 몇 가지 개념은 원래의 속성 (속성 이름)을 기본 필드 (속성 값)에 매핑하는 개체의 백업 복사본 또는 Dictionary<string, object>
을 사용하는 것입니다.
변경 사항이 있는지 확인하려면 INotifyPropertyChanged 인터페이스를 사용합니다. 이렇게하면 상태 관리 및 알림을 클래스 내부에 보관할 수 있습니다. 부울 배열/사전 (Dict<string, bool>
)을 설정하는 OnPropertyChanged (문자열 propName, 객체 propValue)라는 래퍼를 구현하면 속성이 변경되면 HasChanges 속성이 true를 반환하고 변경 사항이 있는지 여부를 설정할 수 있습니다. 예 클래스 : 단순 위해서
public class TestClass : INotifyPropertyChanged
{
private Dictionary<string, object> BackingStore = new Dictionary<string,object>();
private Dictionary<string, bool> Changes = new Dictionary<string, bool>();
private string _testString;
public string TestString
{
get { return _testString; }
set { _testString = value; OnPropertyChanged("TestString", value); }
}
private bool HasChanges { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
public TestClass(string value)
{
_testString = value;
SaveValues();
}
public void SaveValues()
{
// Expensive, to use reflection, especially if LOTS of objects are going to be used.
// You can use straight properties here if you want, this is just the lazy mans way.
this.GetType().GetProperties().ToList().ForEach(tProp => { BackingStore[tProp.Name] = tProp.GetValue(this, null); Changes[tProp.Name] = false; });
HasChanges = false;
}
public void RevertValues()
{
// Again, you can use straight properties here if you want. Since this is using Property setters, will take care of Changes dictionary.
this.GetType().GetProperties().ToList().ForEach(tProp => tProp.SetValue(this, BackingStore[tProp.Name], null));
HasChanges = false;
}
private void OnPropertyChanged(string propName, object propValue)
{
// If you have any object types, make sure Equals is properly defined to check for correct uniqueness.
Changes[propName] = BackingStore[propName].Equals(propValue);
HasChanges = Changes.Values.Any(tr => tr);
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
, 난 그냥 저장 SaveValues / RevertValues를 사용/변경 사항을 취소. 그러나 이들을 사용하여 쉽게 IEditableObject
인터페이스 (BeginEdit, CancelEdit, EndEdit)를 구현할 수 있습니다. 그런 다음 PropertyChanged 이벤트는 객체가 바인딩되는 양식 (또는 단일 인스턴스 만 구독해야하는 기본 BindingList)에 가입 할 수 있습니다.이 양식은 HasChanges 플래그를 확인하고 적절한 상태를 설정합니다. 형태.
UI가 영리해야합니까? 저장 버튼을 활성화하고 활성화 된 상태로 변경하는 것이 어떻습니까? 사용자가 값을 다시 변경하면 여전히 변경된 것입니다. 비즈니스 응용 프로그램에 따라 즉시 변경된 경우에도 "변경된 내용"을 추적 할 가치가 있습니다. 감사 로그는 아무 것도 변경하지 않더라도 "이 레코드가 다시 명시 적으로 User123에 저장되었습니다"라고 말할 수 있습니다. 내 이전 관리자가 준 요구 사항 중 하나였던 – David
. 나는 그 때까지는 생각하지 않았지만, 불필요한 트래픽을 원하지 않는다고 생각한다. 컴퓨터 지식이없는 일부 사용자는 텍스트를 변경 한 다음 다시 변경하고 다시 저장하기 때문에 (항상 필요하다고 생각한다. 어쨌든 저장 버튼을 클릭하십시오). 그가 내게 말한 이유 중 하나는 사용자가 이미 저장했다는 것을 알았 기 때문입니다. –