Silverlight绑定问题

时间:2010-09-26 16:37:47

标签: c# silverlight data-binding

好的,我已经尝试在codeplex http://silverlightcoverflow.codeplex.com/

上实现了一个封面流程

我想用我自己的类进行数据绑定:

    class CoverItem
    {
        BitmapImage _image;
        string _title;
        string _link;
        string _content;

        public BitmapImage Image
        {
            get { return _image; }
            set { _image = value; }
        }

        public string Title
        {
            get { return _title; }
            set { _title = value; }
        }

        public string Link
        {
            get { return _link; }
            set { _link = value; }
        }

        public string Content
        {
            get { return _content; }
            set { _content = value; }
        }
    }

这是来自codeplex的封面用户控件的XAML:

<custom:CoverFlowControl.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <Image Source="{Binding Image}" Width="300" />
            <TextBlock Text="{Binding Title}" Width="300" />
            <TextBlock Text="Testing" Width="300" />
        </StackPanel>
    </DataTemplate>
</custom:CoverFlowControl.ItemTemplate>

我遇到的问题是我为每个绑定的元素得到了“测试”字样,但我没有得到图片或标题,这些图片来自我附加到控件的ItemSource属性的对象。

Covers.ItemsSource = _items;

我的问题是,我哪里错了?这应该是一个简单的绑定,所以想想我错过了什么。

提前感谢您的帮助。

编辑:

如果我将代码更改为:

List<BitmapImage> images = new List<BitmapImage>() { _items[0].Image, _items[1].Image, _items[2].Image, _items[3].Image };

Covers.ItemsSource = images;// _items;

然后有这样的绑定:

<Image Source="{Binding}" Width="300" />

我现在显示我的图像。所以我知道这是绑定的问题。

还试过

<Image Source="{Binding Path=Image}" Width="300" />

2 个答案:

答案 0 :(得分:4)

公开CoverItem课程。 Silverlight的缺点之一是不允许跨程序集的内部类型的反射权限。绑定到CLR属性时,使用反射来获取值。试图获取值的程序集是System.Windows,它没有权限反映程序集中的内部类型。

我在匿名类型(内部类型)的上下文中写过这个: http://surrealization.com/blog/silverlight-anonymous-type-binding-gotcha/

或者,您可以在程序集上提供InternalsVisibleTo属性,以允许System.Windows“查看”您的内部类型。
http://grahammurray.wordpress.com/2010/05/30/binding-to-anonymous-types-in-silverlight/

有关从马口的描述,请参阅此MSDN链接:
http://msdn.microsoft.com/en-us/library/stfy7tfc(VS.95).aspx

  

在Silverlight中,您无法使用   反射访问私有类型和   成员。如果是某种类型的访问级别   或会员会阻止你   以静态编译方式访问它   代码,您无法动态访问它   通过使用反射。


http://connect.microsoft.com/VisualStudio/feedback/details/526229/in-silverlight-4-binding-to-an-internal-data-by-code-doesnt-work

  

Silverlight支持绑定到public   仅限类型。

答案 1 :(得分:0)

我还没有检查过CoverFlow项目,但是从你在XAML中定义绑定的方式来看,模型中的Image属性通常应该是Uri而不是 public Uri Image { get; set; } // should also be renamed to ImageUri 实际图像控制:

Image

无论如何,这更干净。如果您真的必须在模型中使用实际ContentPresenter,则必须在XAML中定义Title

至于{{1}}无法显示的原因,我不知道。