我正在開發用於Metro UI的ImagePicker用戶控件。它的原理很簡單:它顯示圖像,並且當圖像被點擊時,打開文件對話框以允許改變當前圖像。爲了實現這一點,用戶控件只需公開包裝圖像綁定到的ImageSource屬性。XAML:用戶控件不傳播更改到綁定源
<local:ImagePicker Source="{Binding PictureUri, Mode=TwoWay}"/>
啓動時,綁定工作正常,並顯示來自我的視圖模型提供的PictureUri屬性的圖片。問題是,當我點擊圖像並選擇一個新圖像時,會顯示新圖像,但綁定值在我的視圖模型中不會更新,儘管採用了雙向綁定模式。我相信這個問題來自我的用戶控制代碼,但我不明白爲什麼值不會傳播到視圖模型時,它實際上是傳播到包裝圖像...
所以這裏是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
感謝您耐心閱讀這麼長的帖子。
當您刪除異步修改器時會發生什麼?前段時間,有一個錯誤[異常不是使用異步引發的](http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/bea154b0-08b0-4fdc-be31- 058d9f5d1c4e)。另外,我不完全確定,但不能使用異步來更新UI線程上的某些內容。 –
@MetroSmurf我希望我可以嘗試,但當然,文件選取器不提供同步方法。我要用硬編碼的字符串嘗試。 – Ucodia
@MetroSmurf我只是同步嘗試,一切仍然表現相同。 – Ucodia