Привязка изображений, Silverlight, C #, WP7 - PullRequest
1 голос
/ 02 ноября 2011

Мне удалось связать изображения, хранящиеся в изолированном хранилище, с элементами «Изображение» в списке, определенном в 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 не вызывается в этом сценарии?

Спасибо!

Вот что я пробовал:

  1. Реализация 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);
    }
  1. Использование 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.

Спасибо всем. Я надеюсь, что это поможет кому-то там.

1 Ответ

0 голосов
/ 02 ноября 2011

Он никогда не вызывается, потому что ваша собственность не вызывает PropertyChanged уведомление.Вам нужно либо сделать его DependencyProperty, либо реализовать INotifyPropertyChanged и вызвать событие PropertyChanged, когда значение свойства установлено.

...