我正在为 Metro UI 开发一个 ImagePicker 用户控件。它的原理很简单:它显示一个图像,当点击图像时,会打开一个文件对话框,允许更改当前图像。为此,用户控件只需公开包装图像绑定到的 ImageSource 属性。
<local:ImagePicker Source="{Binding PictureUri, Mode=TwoWay}"/>
在启动时,绑定工作正常,并显示来自我的视图模型提供的 PictureUri 属性的图片。问题是,当我点击图像并选择一个新图像时,会显示新图像,但尽管使用了 TwoWay 绑定模式,但我的视图模型中的绑定值并未更新。我相信这个问题来自我的用户控制代码,但我不明白为什么当它实际传播到包装图像时该值没有传播到视图模型......
所以这里是 XAML 部分。
<UserControl x:Name="ImagePickerUserControl"
x:Class="ImageUserControl.ImagePicker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="ImagePickerRootGrid" Background="Gray">
<Image Source="{Binding Source, ElementName=ImagePickerUserControl}"/>
</Grid>
</UserControl>
和代码部分,对不起长度,但我相信这里一切都很重要。
public sealed partial class ImagePicker : UserControl
{
public ImagePicker()
{
this.InitializeComponent();
// Hookup event to handle when the control is tapped
this.Tapped += ImagePicker_Tapped;
}
public static readonly DependencyProperty SourceProperty =
DependencyProperty.Register("Source", typeof(ImageSource), typeof(ImagePicker),
new PropertyMetadata(null, new PropertyChangedCallback(ImagePicker.OnSourceChanged)));
public ImageSource Source
{
get
{
return (ImageSource)this.GetValue(ImagePicker.SourceProperty);
}
set
{
this.SetValue(ImagePicker.SourceProperty, value);
}
}
private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Update Visual State
}
private async void ImagePicker_Tapped(object sender, TappedRoutedEventArgs e)
{
// Pick up a new picture
FileOpenPicker filePicker = new FileOpenPicker();
filePicker.FileTypeFilter.Add(".jpg");
filePicker.FileTypeFilter.Add(".jpeg");
filePicker.FileTypeFilter.Add(".png");
var pngFile = await filePicker.PickSingleFileAsync();
// If the user picked up a file
if (pngFile != null)
{
BitmapImage bitmap = new BitmapImage();
await bitmap.SetSourceAsync(await pngFile.OpenReadAsync());
// Update the source image
this.Source = bitmap;
}
}
}
我相信这个问题只是我的一个错误,但我无法理解这里发生了什么。如果您想尝试运行该项目并更好地查看代码,我将其上传并分享到 SkyDrive:ImageUserControl
感谢您耐心阅读这么长的帖子。