Caliburn Micro未更新用户控件

时间:2015-05-16 19:35:02

标签: c# wpf mvvm dependency-properties caliburn.micro

我有一个Caliburn Micro View / ViewModel设置,它使用一个用户控件,它的一个依赖属性绑定到主视图的ViewModel中的值。当ViewModel中的值发生变化时,我似乎无法通知用户控件。

视图模型:

OutputImage.AddDirtyRect(new Int32Rect(0, 0, width, height));
OutputImage.Unlock();

NotifyOfPropertyChange(() => OutputImage);

主要观点:

<local:HistogramControl x:Name="Histogram" Grid.Row="1" Grid.Column="0" OutputImage="{Binding Path=OutputImage, Mode=TwoWay}"/>

用户控制:

    public static readonly DependencyProperty OutputImageProperty =
    DependencyProperty.Register("OutputImage", typeof(BitmapSource), typeof(HistogramControl), new UIPropertyMetadata(
            new WriteableBitmap(1, 1, 96, 96, PixelFormats.Rgb24, null),
            new PropertyChangedCallback((s, e) =>
            {
                var source = s as HistogramControl;
                source.UpdateHistogram();
            })));
    public BitmapSource OutputImage
    {
        get { return (BitmapSource)GetValue(OutputImageProperty); }
        set { SetValue(OutputImageProperty, value); }
    }

如果我在PropertyChangedCallback(...) lambda中的用户控制代码中放置一个断点,它将在应用程序启动时被点击一次,并且提供了在ViewModel类的构造函数中设置的初始OutputImage,但它不会调用上面显示的ViewModel代码并且OutputImage发生更改时再次调用。

1 个答案:

答案 0 :(得分:0)

问题在于,由于图像数据被复制到像素缓冲区,因此通过指向不安全代码的内存指针修改了WriteableBitmap。这并没有触发绑定更新,因为对象绑定并未真正更新。由于绑定是通过引用,因此用户控件内的绑定值中的像素数据在更改时更新,通过调用PropertyChangedCallback(...)没有通知。