我是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从未绑定到它一样。
我期待着您的回复!
答案 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属性发生了变化。