проблема
В Windows Phone 7 можно привязать Source-свойство Image-control либо к строке, либо к Uri, и они оба работают. В WinRT привязка к Uri не работает.
Учитывая следующее XAML:
<ListBox x:Name="Items"> <ListBox.ItemTemplate> <DataTemplate> <Image Width="500" Height="500" Source="{Binding Image}"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox> |
И следующий вид модели:
public class ItemVM { public string Image { get; set; } public string Title { get; set; } public string Subtitle { get; set; } } |
Изображение отображается правильно в WinRT. Но если модель представления содержит Uri вместо строки, изображение не отображается.
public class ItemVM { public Uri Image { get; set; } public string Title { get; set; } public string Subtitle { get; set; } } |
Это может быть проблематично, если вы хотите использовать виртуальные машины на разных платформах.
Одно из возможных решений
Если вам нужно заставить работать привязку к Uri, вы можете создать следующий конвертер значений:
public class ImageUriValueConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { var uri = value as Uri; if (uri == null) return null; var result = uri.ToString(); return result; } public object ConvertBack(object value, Type targetType, object parameter, string language) { throw new NotImplementedException(); } } |
И используйте это в вашей привязке:
<Page.Resources> <local:ImageUriValueConverter x:Name="Converter"/> </Page.Resources> <Grid Background="{StaticResource ApplicationPageBackgroundBrush}"> <ListBox x:Name="Items"> <ListBox.ItemTemplate> <DataTemplate> <Image Width="500" Height="500" Source="{Binding Image, Converter={StaticResource Converter}}"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> |
Другое возможное решение
Это похоже на бета-версию, которая может быть очень хорошо исправлена в финальной версии.
Обновление 5.2.2012
Мортен написал отличный отзыв в комментариях. По какой-то причине блог не позволяет мне одобрить его, поэтому вот его полный комментарий:
Try this instead: <Image> <Image.Source> <BitmapImage UriSource="{Binding ImageUri}" /> </Image.Source> </Image>
This avoids all the converter code, and also allows you to be more specific on your BitmapImage wrt CreationOptions, DecodePixelSize etc. (however with a converter let me suggest you convert to a BitmapImage instead of string, or you’ll just hit more converters when processing the binding)