2010-03-15 39 views
2

我的代碼目前看起來是這樣的:依賴屬性後調用C#功能已設置

private Foo myFoo; 

public Foo CurrentFoo 
{ 
    get { return myFoo; } 
    set { SetFoo(value); } 
} 

private void SetFoo(Foo newFoo) 
{ 
    // Do stuff 
    // Here be dragons 

    myFoo = newFoo; 
} 

爲了能夠將它綁定在XAML/WPF我需要打開Foo成一個依賴屬性:

public static DependencyProperty CurrentFooProperty = 
    DependencyProperty.Register("CurrentFoo", typeof(Foo), 
     typeof(FooHandler), new PropertyMetadata(false));   

public Foo CurrentFoo 
{ 
    get { return (Foo)GetValue(CurrentFooProperty); } 
    set { SetValue(CurrentFooProperty, value); } 
} 

我聽說你不應該在實際的C#屬性set {}中做魔術,因爲它可能不會被調用,但是該值直接寫入依賴項屬性。如果這是錯誤的,讓我知道,這似乎是最明顯和簡單的路線。

我知道我可以添加一個驗證函數的依賴屬性,但我認爲它不應該用於這個?我需要將更改傳達給尚未綁定到XAML的舊系統。

什麼是解決這個問題的最好方法?

回答

4
public static DependencyProperty CurrentFooProperty = DependencyProperty.Register(
    "CurrentFoo", 
    typeof(Foo), 
    typeof(FooHandler), 
    new PropertyMetadata(OnCurrentFooChanged)); 

private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var currentFoo = (Foo) e.NewValue; 

    // Use 
} 
1

這應該由分配給依賴屬性的回調來處理。這樣做的正確位置取決於什麼是真正發生在這裏:

// Do stuff 
// Here be dragons 

three callbacks that can be assigned to a Dependency Property - 如果你只需要通知的遺留系統,那麼我建議增加一個Property Changed callback,並添加通知那裏。

但是,如果這是執行的東西,通過遺留系統達驗證,它可以給您的方案更適合於把這些龍成ValidationCallback.

我懷疑CoerceValue回調是合適的。