2011-02-11 2 views
0

여기에서는 종속성 객체로 작업하고 있지만 이전에는별로 도움이되지 않았지만 매우 유용합니다.WPF C# 기록 종속성 객체 데이터 수정

기본적으로 ListView에서이 개체를 편집 할 수있게 사용했습니다. 그러나 이러한 변경 사항을 다시 SQL에 기록해야합니다. 내 질문은 누군가가 데이터를 볼 때마다 SQL에 다시 쓰고 싶지 않기 때문에 데이터가 수정되었는지 여부를 기록하는 방법이 있는지입니다. 그 일의

public static bool DataModified = false; 

    public static readonly DependencyProperty DepartmentProperty = DependencyProperty.Register("Department", typeof(string), typeof(KPI), new UIPropertyMetadata(null)); 

    public string Department 
    { 
     get { return (string)GetValue(DepartmentProperty); } 
     set { SetValue(DepartmentProperty, value); DataModified = true; } 
    } 

그래서 뭔가 DataModified 속성이 TRUE로 설정됩니다 편집 할 때마다, 이것이 좋은 방법 :

public class KPI : DependencyObject 
{ 
    public static readonly DependencyProperty DepartmentProperty = DependencyProperty.Register("Department", typeof(string), typeof(KPI), new UIPropertyMetadata(null)); 

    public string Department 
    { 
     get { return (string)GetValue(DepartmentProperty); } 
     set { SetValue(DepartmentProperty, value); } 
    } 

    public static readonly DependencyProperty KPINumberProperty = DependencyProperty.Register("KPINumberProperty", typeof(int), typeof(KPI), new UIPropertyMetadata(null)); 

    public int KPINumber 
    { 
     get { return (int)GetValue(KPINumberProperty); } 
     set { SetValue(KPINumberProperty, value); } 
    } 
} 

내 생각 같은 것을 가지고 있었다 : 현재 나는이 있습니다 ? 아니면 누군가가 훨씬 더 나은 방법을 가지고 있습니까?

미리 감사드립니다.

SumGuy.

답변

1

WPF 바인딩 시스템이하지 않는 반드시 호출 Department CLR 속성 대신 직접 호출이이 경우 종속성 속성을 (갱신 때마다 SetValueDepartment). 즉, CLR 래퍼가 호출되지 않을 수도 있습니다. 즉, set 블록 (CLR 속성)에 작성한 코드가 실행되지 않습니다.

하지만 걱정하지 마세요. 해결책이 있습니다. DepartmentProperty을 초기화하는 동안 UIPropertyMetadata에 콜백을 전달할 수 있습니다. 콜백은 종속성 속성을 업데이트 할 때마다 호출됩니다. 즉, 다음을 구현해야한다는 의미입니다.

+0

어떤 경우 바인딩 엔진이 SetValue를 직접 호출하는 대신 Department CLR 속성을 호출합니까? – Robin

+0

@Robin : 말하기 어렵습니다. 경우에 따라 CLR 래퍼를 호출 할 수 있으며, 경우에 따라 'GetValue' 및'SetValue' 메서드를 직접 호출 할 수 있습니다. 게다가 CLR 속성은 인텔리 센스를 사용하여 XAML에서 이름을 표시합니다. – Nawaz

+0

CLR 속성을 만드는 것이 더 나은 습관에 동의하지만 바인딩 엔진이 GetValue 또는 SetValue 대신에이를 사용하는 시간을 보거나 읽지 않았습니다. 나는 당신의 말을 받아 들일 것이다. – Robin

4

종속성 속성에 바인딩하는 경우 실제로는 작동하지 않습니다. WPF 바인딩 엔진은 CLR "Department"속성을 실제로 사용하지 않고 종속성 속성에서 직접 "SetValue"를 사용합니다. 이것에도 쉬운 해결책이 있습니다.

UIPropertyMetadata는

은 여기 (하나의 호출로부터 직접 SetValue를 위해, 또는 CLR 속성을 통해 어느는 SetValue는 호출을 배치한다) 속성의 값이 변경 될 때마다 발생하는 PropertyChangedCallback하기위한 필드를 가지고 예 :

DependencyObject (d)는 속성이 속한 객체입니다. 귀하의 경우 KPI의 인스턴스가됩니다. 참고로

, 여기에 UIPropertyMetadata MSDN 문서에 대한 링크입니다 : http://msdn.microsoft.com/en-us/library/system.windows.uipropertymetadata.aspx