2011-02-11 18 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ブロック(Department CLRプロパティ)で記述したコードは実行されません。

しかし、心配はいりませんが、解決策があります。 DepartmentPropertyを初期化するときに、UIPropertyMetadataにコールバックを渡すことができます。このコールバックは、依存関係プロパティを更新するたびに呼び出されます。つまり、これを実装する必要があります。

+0

バインディングエンジンはSetValueを直接呼び出す代わりにDepartment CLRプロパティをどのように呼び出しますか? – Robin

+0

@ロビン:言うことは難しい。場合によってはCLRラッパーを呼び出すことがあり、場合によっては 'GetValue'メソッドと' SetValue'メソッドを直接呼び出すことがあります。さらに、CLRプロパティは、XAML内の名前を呼び出すためにインテリセンスを行います。 – Nawaz

+0

私は、CLRプロパティを作成する方が良い習慣であることに同意しますが、バインディングエンジンがGetValueまたはSetValueの代わりにそれらを使用する場所については、見たことも読み取ったこともありません。私はそれについてあなたの言葉を取るでしょう。 – Robin

4

これは依存関係プロパティにバインドしている場合、実際には機能しません。 WPFバインディングエンジンは、実際にはCLRの "Department"プロパティを使用せず、 "SetValue"を依存プロパティで直接使用します。しかしこれには簡単な解決策があります。

UIPropertyMetadataは、プロパティの値が変更されるたびに発生しますPropertyChangedCallbackのためのフィールドがある(直接のいずれかの呼び出しからの値の代入には、setValueの呼び出しをラップしているCLRプロパティを通じて)

ここです例:

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

private static void DepartmentPropertyChanged(DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
{ 
    KPI me = d as KPI; 
    if (me == null) return; 

    // Talk to your Business/Data layers here 
}  

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

DependencyObject(d)は、プロパティが属するオブジェクトです。あなたの場合、これはKPIのインスタンスになります。参考のため

は、ここUIPropertyMetadata MSDNのドキュメントへのリンクです:http://msdn.microsoft.com/en-us/library/system.windows.uipropertymetadata.aspx

関連する問題