Image Binding,Silverlight,C#,WP7

时间:2011-11-01 22:02:40

标签: c# silverlight xaml windows-phone-7

我已经成功地将存储在隔离存储中的图像绑定到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";

文件的路径和名称是正确的,因此不存在“找不到文件”的问题。

我的问题是我的IValueConverter的Convert方法永远不会被调用。

正如我之前提到的,我在另一个XAML(在同一个项目中)成功使用了这个转换器,一切正常。唯一的区别是我绑定到ListBox使用的图像。

在这种情况下,为什么没有调用我的IValueConverter的Convert方法的任何想法或提示?

谢谢!

以下是我的尝试:

  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");
            }
        }
    }
    
    }
    
  2. 这是我分配给该物业的方式:

        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";
      }
      
    2. 以下是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"
      

      感谢。

      更新

      我正在使用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>
      

      因此,我添加了image元素的“DataContext”属性,指定包装我的属性的类的名称。在这种情况下, IValueConverter的Convert方法称为。但是,这是不对的,因为我在添加DataContext时在XAML中收到错误:“无法确定调用者的应用程序身份”,当然,踩到Convert方法,我的“value”字符串为空,因此,“右边“”PhotoName“没有被填充。

      感谢任何想法...

      P.S。这是我如何定义IValueConverter的Convert方法:

      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)
              {
                     ... 
      

      UPDATE FIXED

      我已经解决了这个问题。我已将包含my property的类名分配给XAML代码中定义的图像的DataContext属性。

      谢谢大家。我希望这能帮助那些人。

1 个答案:

答案 0 :(得分:0)

它永远不会被调用,因为您的属性不会引发PropertyChanged通知。您需要将其设为DependencyProperty或实施INotifyPropertyChanged,并在设置属性值时引发PropertyChanged事件。