Привязка данных изображения Silverlight - PullRequest
1 голос
/ 27 мая 2010

Я новичок в 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, никогда не привязанное к нему.

Я с нетерпением жду вашего ответа!

Ответы [ 4 ]

0 голосов
/ 27 мая 2010

Спасибо за объяснения. Однако мне не нужна двухсторонняя привязка. Одним способом, когда ItemsManager загружает изображение элемента, оно должно автоматически обновляться в элементе управления 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, так что теперь он находится в своем собственном файле класса, но изображение по-прежнему остается пустым, даже несмотря на то, что растровое изображение прибывает и изменяется в свойстве BitmapSource объекта Item.

0 голосов
/ 27 мая 2010

В этом коде есть несколько ошибок: -

  • Вы напрямую связались с BitmapImage, предоставляемым свойством BitmapSource, поэтому вы все равно удалили вложенный класс Item из картинки.
  • Также для вызова установщика свойства вам понадобится что-то, чтобы присвоить значение свойству Image elements 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.

0 голосов
/ 27 мая 2010

Во-первых, не связывайтесь с BitmapImage, если у вас нет веских причин. Привязка к строке достаточно хороша. Неявное преобразование произойдет автоматически. Во-вторых, используйте декларативное связывание. Программатическое создание и связывание - настоящий беспорядок. В-третьих, только внедрите INotifyPropertyChanged, если вам нужно отправить изменения этого свойства в пользовательский интерфейс.

Вы, вероятно, слишком усложняете ситуацию со всем этим дополнительным кодом.

0 голосов
/ 27 мая 2010

PropertyChanged ("BitmapSource") срабатывает в случае двусторонней привязки. То есть если вы используете двустороннюю привязку, а затем вручную измените источник изображения, например

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

Событие, измененное свойством, будет запущено.

Что касается внешнего вида изображения, кажется, что вы связываете данные неправильно. Попробуйте декларативные привязки.

...