【问题标题】:Silverlight Image Data BindingSilverlight 图像数据绑定
【发布时间】:2010-05-27 09:31:20
【问题描述】:

我是 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 为空,就像 Image 从未绑定到它一样。

期待您的回音!

【问题讨论】:

    标签: silverlight image data-binding


    【解决方案1】:

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

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

    将触发属性更改事件。

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

    【讨论】:

    • 好吧,基本上我已经实现了INotifyPropertyChanged接口,只是为了尝试为什么绑定不起作用,我真的只需要单向绑定。我不会手动更改图像,因为它是这样工作的。我只想在属性 BitmapSource 到达时自动设置 Image.Source,并将从 null 更改为真正的 BitmapImage 对象。
    【解决方案2】:

    这段代码有几个问题:-

    • 您已直接绑定到由BitmapSource 属性公开的BitmapImage,因此无论如何您已将嵌套的Item 类排除在外。
    • 此外,要调用属性设置器,您需要为Image 元素Source 属性赋值,并且您的绑定需要采用双向模式。
    • 您的绑定对象创建很混乱,它指定了一个路径(无论如何都是错误的),然后直接绑定到源。

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

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

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

    另一件事可能是个问题,我不记得 Silverlight 是否支持绑定到嵌套类型。您可能需要将您的 Item 类从 ItemsManager 中取出,并给它一个更具体的名称,例如 ManagedItem

    【讨论】:

    • 谢谢,好信息。有些部分因为我重写了几次而搞砸了。
    【解决方案3】:

    首先,除非你有充分的理由,否则不要绑定到 BitmapImage。绑定到字符串就足够了。隐式转换将自动发生。其次,使用声明式绑定。程序化创建和绑定是一团糟。第三,仅当您需要将该属性的更改发送到 UI 时才实施 INotifyPropertyChanged。

    所有这些额外的代码可能会使您的情况过于复杂。

    【讨论】:

    • 好的,谢谢。似乎在代码中直接赋值比自动绑定更容易。
    【解决方案4】:

    感谢您的解释。但是,我不需要双向绑定。只有一种方式,一旦 ItemsManager 下载了 Item 图片,它应该会在 Image 控件中自动更新。

    所以,我将代码更改为:

    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);
    

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

    【讨论】:

    • 这个“答案”的内容实际上并不是一个答案,而是一个进度更新。您应该使用编辑功能修改您的问题,并将此内容放在问题的末尾。完成后,您可以删除此答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多