Wpf MVVM DependencyProperty不';当RaiseProperty更改时不更新

Wpf MVVM DependencyProperty不';当RaiseProperty更改时不更新,wpf,Wpf,我有usercontrol,其中定义了DependencyProperty #region ImageUri public static readonly DependencyProperty ImageUriProperty = DependencyProperty.Register( "ImageUri", typeof(string), typeof(ScrollableCanvas), new Propert

我有usercontrol,其中定义了DependencyProperty

        #region ImageUri
    public static readonly DependencyProperty ImageUriProperty = DependencyProperty.Register(
       "ImageUri",
       typeof(string),
       typeof(ScrollableCanvas),
       new PropertyMetadata(new PropertyChangedCallback(ImageUriPropertyChangedCallback)));

    private static void ImageUriPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        ScrollableCanvas main = sender as ScrollableCanvas;
        if (main != null)
        {
            main.ImageUri = (string)e.NewValue;
        }
    }

    public string ImageUri
    {
        get
        {
            return (string)GetValue(ImageUriProperty);
        }
        set
        {
            SetValue(ImageUriProperty, value);
            UpdateImage();
        }
    }
    #endregion
在Xaml中,我像这样绑定一个值

<my:ScrollableCanvas  Name="scrollableCanvas1" ImageUri="{Binding Path=LayerImage}" />

更新viewmodel中的LayerImage时,ImageUri属性不会更新

能帮点忙吗?谢谢


顺便说一句:当我在viewmodel的构造函数中设置LayerImage时,该值会更新。

您不应该在setter中包含您的
UpdateImage
调用,而应该包含在属性更改回调中

public static readonly DependencyProperty ImageUriProperty = DependencyProperty.Register(
   "ImageUri",
   typeof(string),
   typeof(ScrollableCanvas),
   new PropertyMetadata(new PropertyChangedCallback(ImageUriPropertyChangedCallback)));

private static void ImageUriPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    ScrollableCanvas main = sender as ScrollableCanvas;
    if (main != null)
    {
        // Since ImageUri has already been called at this point, you can just update your image here...
        main.UpdateImage();
    }
}

public string ImageUri
{
    get
    {
        return (string)GetValue(ImageUriProperty);
    }
    set
    {
        SetValue(ImageUriProperty, value);
    }
}