Мне удалось связать изображения, хранящиеся в изолированном хранилище, с элементами «Изображение» в списке, определенном в XAML, без каких-либо проблем.
Я использовал свойство, хранящее имя и местоположение изображения в изолированном хранилище, и IValueConverter, чтобы фактически открыть файл и получить его поток.
Я удивлен, что не могу сделать это в новом XAML с еще более простой настройкой. Все, что у меня есть, это:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.Resources>
<c:BinaryToImageSRCConverter x:Key="imageConverter" />
</Grid.Resources>
<Image Name="TheImage" Source="{Binding PhotoName, Converter={StaticResource imageConverter}}" Width="430" Height="430" VerticalAlignment="Center" Stretch="UniformToFill">
</Image>
</Grid>
и вот что у меня в ModelView:
public string PhotoName { get; set; }
PhotoName = "Images\\0.jpg";
Путь и имя файла указаны правильно, поэтому проблема «не найти файл» не является проблемой.
Моя проблема в том, что метод Convert моего IValueConverter никогда не вызывается.
Как я упоминал ранее, я успешно использую этот конвертер в другом XAML (в том же проекте), и все работает правильно. Разница лишь в том, что я привязываюсь к изображению, используемому ListBox.
Какие-либо идеи или советы о том, почему метод Convert моего IValueConverter не вызывается в этом сценарии?
Спасибо!
Вот что я пробовал:
Реализация INotifyPropertyChanged :
public class PhotoNameClass : INotifyPropertyChanged
{
public string PhotoNameValue = string.Empty;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public string PhotoName
{
get
{
return this.PhotoNameValue;
}
set
{
if (value != this.PhotoNameValue)
{
this.PhotoNameValue = value;
NotifyPropertyChanged("PhotoName");
}
}
}
}
Вот как я присвоил свойству:
public partial class ShowContent : PhoneApplicationPage
{
PhotoNameClass photoClass = new PhotoNameClass();
}
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
photoClass.PhotoName = "Images\\0.jpg";
base.OnNavigatedTo(e);
}
Использование DependencyProperty
public partial class ShowContent : PhoneApplicationPage
{
// PhotoNameClass photoClass = new PhotoNameClass ();
public string PhotoName
{
get { return (string)GetValue(PhotoNameProperty); }
set { SetValue(PhotoNameProperty, value); }
}
public static readonly DependencyProperty PhotoNameProperty = DependencyProperty.Register("PhotoName", typeof(string), typeof(ShowContent), new PropertyMetadata(""));
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
PhotoName = "Images\\0.jpg";
}
Вот соответствующие части XAML:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.Resources>
<c:BinaryToImageSRCConverter x:Key="imageConverter" />
</Grid.Resources>
<Image Name="TheImage" Source="{Binding PhotoName, Converter={StaticResource imageConverter}}" Width="430" Height="430" VerticalAlignment="Center" Stretch="UniformToFill">
</Image>
</Grid>
где c определяется как:
xmlns:c="clr-namespace:ImageApplication"
Спасибо.
UPDATE
Я использую реализацию INotifyPropertyChanged для предоставления моего свойства.
Я изменил код XAML на это:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.Resources>
<c:PhotoNameClass x:Key="photoClass" />
<c:BinaryToImageSRCConverter x:Key="imageConverter" />
</Grid.Resources>
<Image Source="{Binding PhotoName, Converter={StaticResource imageConverter}}" DataContext="{StaticResource photoClass}" Width="430" Height="430" VerticalAlignment="Center" Stretch="UniformToFill">
</Image>
</Grid>
</Grid>
Поэтому я добавил атрибут «DataContext» элемента изображения, указав имя класса, который переносит мое свойство. В этом сценарии метод Преобразования IValueConverter IS называется . Тем не менее, это не правильно, так как я получаю сообщение об ошибке в XAML при добавлении DataContext: «Невозможно определить личность вызывающего приложения» и, конечно, при входе в метод Convert моя строка «value» пуста, поэтому right "" PhotoName "не заполняется.
Спасибо за любые идеи ...
P.S. Вот как я определил свой метод Convert для IValueConverter:
namespace ImageApplication
{
public class BinaryToImageSRCConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{ // <-- Breakpoint here. Never gets triggered except after I added the "DataContext" attribute to the XAML image element.
// but in that case, "value" is an empty string.
if (value != null && value is string)
{
...
ОБНОВЛЕНИЕ ОБНОВЛЕНО
Я исправил проблему. Я назначил имя класса, включающее мое свойство, в свойство DataContext изображения, определенного в коде XAML.
Спасибо всем. Я надеюсь, что это поможет кому-то там.