2012-04-13 82 views
3

我創建了一個控件,從Canvas派生,應繪製一個活圖,給定的值通過綁定傳遞給DependencyProperty。簡化版本是這樣的:DependencyProperties:PropertyChangedCallBack只調用一次

public class Plotter : Canvas 
{ 
    public float Value { get { return (float)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } 

    public static readonly DependencyProperty ValueProperty = 
     DependencyProperty.Register("Value", typeof(float), typeof(Plotter), 
     new PropertyMetadata(0f, new PropertyChangedCallback(ValueChangedCallBack))); 

    public static void ValueChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args) 
    { 
     Plotter plotter = (Plotter)property; 
     plotter.Value = (float)args.NewValue; //<-- Removed this line to get it to work 

     // Actually draw the value into the canvas geometry 
     plotter.PlotValue(plotter.Value); 
    } 
} 

我必然是這樣的控制:

<mystuff:Plotter Value="{Binding MyViewModelProperty}" Height="50" Width="200" /> 

我的視圖模型實現INotifyPropertyChanged和正確調用PropertyChanged。如果我將MyViewModelProperty綁定到文本框,它每次都會正確更新。只有當我將其綁定到我自己的控件時,我的ValueChangedCallBack僅在頁面加載時調用一次,然後再次不再。

我在這裏沒有看到什麼?謝謝你的幫助!

已解決:我不必在回調中明確地設置Value

回答

5

您在屬性值更改的回調中設置屬性值。無論如何,這沒有多大意義。但是,本地設置的值是否覆蓋綁定值,導致您的綁定不再設置在依賴項屬性上?

+0

啊,那就是問題所在。非常感謝!我剛剛刪除了明確設置「Value」的行,現在它可以工作! – 2012-04-13 11:04:06

1

您是否需要將您的綁定模式設置爲TwoWay?

+0

不,它應該是單向綁定。 ViewModel吐出一個新的值,並且我的控件應該被通知並將其繪製到畫布幾何圖形中。 – 2012-04-13 10:58:28

1

應該不是使用DependencyProperty.Register而不是DependencyProperty.RegisterAttached?

+0

哦,對不起,只是複製並粘貼錯誤。最初它是''DependencyProperty.Register''。我改變了它,只是爲了確保。它不適用於這兩個版本。 – 2012-04-13 10:59:37

+0

Nicholas W的回答似乎是正確的。移除plotter.Value =(float)args.NewValue;從回調方法,一切都應該沒問題。 – calum 2012-04-13 11:05:05

+0

是的,這是問題所在。謝謝! – 2012-04-13 11:06:38