Проблем със свързването на Silverlight

Добре, така че се опитах да внедря coverflow, намерен на 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; }
        }
    }

Това е XAML за Cover User Control от codeplex:

<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" />

person jimplode    schedule 26.09.2010    source източник
comment
Какъв тип списък е _items и кога/как се създава? Освен това кога отделните CoverItems се добавят към списъка?   -  person Gone Coding    schedule 26.09.2010
comment
частен списък‹CoverItem› _items = нов списък‹CoverItem›();   -  person jimplode    schedule 26.09.2010
comment
Те се попълват от съдържанието на xml файл с помощта на xmlreader, но това не е важно   -  person jimplode    schedule 26.09.2010


Отговори (2)


Направете класа 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 поддържа обвързване само с публични типове.

person Adam Sills    schedule 26.09.2010
comment
Обичам те!! Реших проблема си, не мога да повярвам, че не се сетих да опитам това!! Много благодаря!! - person jimplode; 26.09.2010

Все още не съм проверил този проект CoverFlow, но от начина, по който дефинирате обвързванията във вашия XAML, обикновено се очаква свойството Image във вашия модел да бъде Uri вместо действителна контрола на изображението:

    public Uri Image { get; set; } // should also be renamed to ImageUri

Все пак е по-чисто. Ако наистина, наистина трябва да използвате действително Image във вашия модел, ще трябва да дефинирате ContentPresenter във вашия XAML.

Колкото до това защо Title не се показва, не знам.

person herzmeister    schedule 26.09.2010
comment
Това има същия ефект, дори използването на Uri с обвързването не връща нищо. И аз като вас съм объркан защо текстът не работи. Свързването в XAML винаги ме е обърквало. :/ - person jimplode; 26.09.2010