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在回调中显式设置。

4

3 回答 3

5

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

于 2012-04-13T11:01:48.480 回答
1

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

于 2012-04-13T10:55:56.253 回答
1

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

于 2012-04-13T10:58:25.867 回答