이 문제는 잠시 동안 두통을 유발하여 프로젝트 진행을 방해하고 있습니다. ViewModel에 바인딩 된 컨트롤이 포함 된 WPF XAML 폼을 고려해보십시오. (데이터에 Caliburn.Micro MVVM 프레임 워크와 Entity Framework를 사용하고 있습니다.) Initialize()
메서드는 셸에서 호출하여 데이터베이스에서 폼의 데이터를로드하고 PropertyChanged 이벤트 처리기를 설정합니다. 양식에 변경된 데이터가 있는지 여부를 추적하는 IsDirty
플래그가 있습니다. IsDirty
속성에 바인딩 된 "저장"버튼이있어서 데이터가 변경되면 활성화됩니다.컨트롤이 초기화되는 동안 PropertyChanged가 실행되는 것을 방지하는 방법
// Sample code; forms have many controls....
// this is the property that the controls are bound to
public Entity BoundData { get; set; }
public void Initialize()
{
// this is an example line where I query the database from the Entity Framework ObjectContext...
BoundData = objectContext.DataTable.Where(entity => entity.ID == 1).SingleOrDefault();
// this is to cause the form bindings to retrieve data from the BoundData entity
NotifyOfPropertyChange("BoundData");
// wire up the PropertyChanged event handler
BoundData.PropertyChanged += BoundData_PropertyChanged;
IsDirty = false;
}
void BoundData_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
IsDirty = true;
}
// implementation of the IsDirty flag
public bool IsDirty
{
get
{
return _isDirty;
}
set
{
_isDirty = value;
NotifyOfPropertyChange("IsDirty");
}
}
문제는 Initialize()
방법이 완료된 후 폼에 데이터베이스에서 초기화되고 인해 BoundData_PropertyChanged
이벤트 핸들러가 맞았다는 것이다. 따라서 IsDirty
플래그가 true로 설정되고 양식이 방금로드되어 사용자가 아무 것도 변경하지 않은 경우에도 저장 단추가 사용됩니다. 내가 뭘 놓치고 있니? 분명히 이것은 일반적인 문제이지만 좋은 해결책을 찾을 수 없었습니다. 이것은 첫 번째 MVVM 프로젝트이므로 일부 기본 개념이 누락되었습니다.
UPDATE : 내가 문제가 내가 바인딩의 모두 업데이트 할 때 발광하는 이벤트 또는 콜백에 후크 할 수 있어야한다는 것입니다 생각, 명확히하기 위해, 그래서 다음하여 PropertyChanged 이벤트를 연결할 수 있습니다 핸들러. 값이 실제로 변경된 경우
public virtual bool Prop1
{
get
{
return _prop1;
}
set
{
if (_prop1 != value)
{
_prop1 = value;
NotifyOfPropertyChange("IsDirty");
}
}
그 방법이 이벤트는 트리거, 그리고 단지 : 당신이 도움이 될 할 수
나는이 질문이 오래전에 물었다는 것을 알고 있으며, 지금까지 해결했을 수도 있습니다. 나는 당신의 문제에 대한 해결책을 가지고 있을지도 모르겠지만, 당신이 제공 한 코드 샘플에는 충분한 코드가 없다. XAML의 이벤트를 포함하여 이러한 속성의 값을 변경하는 코드 숨김에서 처리되는 이벤트가 있습니까? 그렇다면 관련된 컨트롤의 IsLoaded 속성을 검사하여 개체의 속성을 업데이트하기 전에 바인딩이 완료되었는지 확인할 수 있습니다. 또한 바인딩이 완료되면 실행되는 컨트롤에 대한 Loaded 이벤트가 있습니다. – user3308241
이 상황에서 XKCD 툰이 있습니다. redtetrahedron - 해결 했습니까? 나는 지금 같은 문제에 직면하고있다. ... – andrew