2012-04-13 86 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