Проблема привязки Silverlight - PullRequest
       1

Проблема привязки Silverlight

1 голос
/ 26 сентября 2010

Хорошо, поэтому я попытался реализовать поток покрытия, найденный в 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 из 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" />

Ответы [ 2 ]

4 голосов
/ 26 сентября 2010

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

0 голосов
/ 26 сентября 2010

Я еще не проверял этот проект CoverFlow, но исходя из того, как вы определяете привязки в вашем XAML, обычно ожидается, что свойство Image в вашей модели будет Uri вместо фактического элемента управления Image:

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

Все равно чище. Если вы действительно, действительно должны использовать Image в вашей модели, вам нужно определить ContentPresenter в вашем XAML.

Что касается того, почему Title не будет отображаться, я не знаю.

...