Silverlight图像数据绑定

时间:2010-05-27 09:31:20

标签: silverlight image data-binding

我是Silverlight的新手,遇到绑定问题。

我有一个类ItemsManager,在其范围内有另一个类Item。

class ItemsManager
{
...
 class Item : INotifyPropertyChanged
 {
  ...
  private BitmapImage bitmapSource;
  public BitmapImage BitmapSource
  {
   get { return bitmapSource; }
   set 
   { 
    bitmapSource = value; 
    if(PropertyChanged != null )PropertyChanged("BitmapSource") 
   }
  }            
 }
}

我在代码中执行以下操作来测试绑定:

 {
  ItemsManager.Instance.AddItem("123");
  //Items manager started downloading item visual 
  //part (in my case bitmap image png)

  Binding b = new Binding("Source");
  b.Source = ItemsManager.Instance.GetItem("123").BitmapSource;
  b.BindsDirectlyToSource = true;

  Image img = new Image();
  img.SetBinding(Image.SourceProperty, b);
  img.Width = (double)100.0;
  img.Height = (double)100.0;

  LayoutRoot.Children.Add(img);
}

加载图像后,图像不会出现。但是,如果我在图像加载后直接设置它的源,它就会显示出来。

我还注意到PropertyChanged(“BitmapSource”)从不触发,因为PropertyChanged为null,就像Image从未绑定到它一样。

我期待着您的回复!

4 个答案:

答案 0 :(得分:0)

PropertyChanged(“BitmapSource”)在双向绑定的情况下触发。 即如果您使用双向绑定,然后手动更改图像源,如

img.Source = new BitmapImage(new Uri("http://...."));

属性更改事件将触发。

对于图像外观,您似乎以错误的方式绑定数据。 尝试声明性绑定。

答案 1 :(得分:0)

此代码有几个问题: -

  • 您已直接绑定到BitmapImage属性所展示的BitmapSource,因此无论如何您都已从图片中取出嵌套的Item类。
  • 同样,对于要调用的属性设置器,您需要为Image元素Source属性分配值,并且您的绑定需要采用双向模式。
  • 您的绑定对象创建很混乱,它指定了一个路径(无论如何都是错误的)但是直接绑定到源。

因此,您的代码需要如下所示: -

Binding b = new Binding("BitmapSource"); 
b.Source = ItemsManager.Instance.GetItem("123"); 
b.Mode = BindingMode.TwoWay;

现在,当为新的BitmapImage分配了Image Source属性时,您的setter代码应该运行。但是,应该记住,此属性属于更通用的类型ImageSource。因此,如果指定ImageSource的另一个派生词,则此代码将中断。

另一件可能是问题的事情,我无法回想起Silverlight是否支持绑定到嵌套类型。您可能需要将Item课程从ItemsManager中删除,并为其指定更具体的名称,例如ManagedItem

答案 2 :(得分:0)

首先,除非你有充分的理由,否则不要绑定到BitmapImage。绑定到字符串就足够了。隐式转换将自动发生。其次,使用声明绑定。程序创建和绑定是一个真正的混乱。第三,如果您需要将该属性的更改发送到UI,则只实现INotifyPropertyChanged。

您可能会因为所有这些额外的代码而使您的情况变得复杂。

答案 3 :(得分:0)

感谢您的解释。但是,我不需要TwoWay绑定。只有一种方法,一旦ItemsManager下载项目图像,它应该在图像控件中自动更新。

所以,我把代码更改为:

ItemsManager.Instance.AddItem("123");

Binding b = new Binding("BitmapSource");
b.Source = ItemsManager.Instance.GetItem("123");

Image img = new Image();
img.SetBinding(Image.SourceProperty, b);
img.Width = (double)100.0;
img.Height = (double)100.0;

LayoutRoot.Children.Add(img);

我还从ItemManager范围中取出了Item,所以它现在在它自己的类文件中,但是即使位图图像到达,图像仍然保持为空,并且Item对象的BitmapSource属性发生了变化。