DependencyProperties: PropertyChangedCallBack 只会被调用一次。

3

我创建了一个控件,它是从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个回答

5

您在 Value 更改的回调上设置了 Value 属性。无论如何,这没有太多意义。但是,该本地设置值是否覆盖了绑定值,导致您的绑定不再设置到依赖属性上?


啊,原来是这个问题。非常感谢!我刚刚删除了显式设置“Value”的那一行代码,现在它可以正常工作了! - Philip Daubmeier

1
你需要将绑定的模式设置为双向吗?

不,它应该只是单向绑定。ViewModel 输出一个新值,我的控件应该被通知并将其绘制到画布几何图形中。 - Philip Daubmeier

1

你不应该使用DependencyProperty.RegisterAttached而不是DependencyProperty.Register吗?


哦,抱歉,这只是一个复制粘贴错误。原本应该是“DependencyProperty.Register”。我改变了它,只是为了确保。但两个版本都无法工作。 - Philip Daubmeier
Nicholas W的回答似乎是正确的。从回调方法中删除plotter.Value = (float)args.NewValue;,一切都应该没问题了。 - calum
是的,那就是问题所在。谢谢! - Philip Daubmeier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接