我有一个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发生更改时再次调用。
答案 0 :(得分:0)
问题在于,由于图像数据被复制到像素缓冲区,因此通过指向不安全代码的内存指针修改了WriteableBitmap。这并没有触发绑定更新,因为对象绑定并未真正更新。由于绑定是通过引用,因此用户控件内的绑定值中的像素数据在更改时更新,通过调用PropertyChangedCallback(...)
没有通知。