DependencyProperties:PropertyChangedCallBack只调用一次

时间:2012-04-13 10:52:49

标签: c# silverlight events windows-phone-7 data-binding

我创建了一个派生自Canvas的控件,该控件应该绘制一个实时图,给定通过绑定传递给DependencyProperty的值。简化版本如下:

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" />

我的ViewModel实现INotifyPropertyChanged并正确调用PropertyChanged。如果我将MyViewModelProperty绑定到文本框,则每次都会正确更新。只有当我将它绑定到我自己的控件上时,我的ValueChangedCallBack仅在页面加载时被调用一次,然后再也不会被调用。

我在这里看不到什么?谢谢你的帮助!

已解决:我不必在回调中明确设置Value

3 个答案:

答案 0 :(得分:5)

您在属性值更改的回调上设置属性Value。在任何情况下都没有多大意义。但是,本地设置值是否覆盖了绑定值,导致不再在依赖项属性上设置绑定?

答案 1 :(得分:1)

您是否需要将绑定模式设置为TwoWay?

答案 2 :(得分:1)

您是否应该使用DependencyProperty.Register而不是DependencyProperty.RegisterAttached?