2015-10-27 2 views
0

У меня проблема с моим приложением WPF, у меня есть Listbox, который содержит UserControl как элемент.WPF Listbox пользовательский элемент изображения не отображается

UserControl

UserControl есть изображение (красный квадрат на рисунке) с Source связываются с ImageSource собственности, как это:

ListboxCustomItem.xaml:

<Image Name="Avatar" Height="56" Width="56" DockPanel.Dock="Left" Source="{Binding AvatarSource}"/> 

ListboxCustomItem.xaml.cs:

private ImageSource avatarSource; 
public ImageSource AvatarSource 
{ 
    get { return this.avatarSource; } 
    set 
    { 
     if(this.avatarSource != value) 
     { 
      this.avatarSource = value; 
      NotifyPropertyChanged(); 
     } 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 
private void NotifyPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Когда я добавляю элемент в свой список, я устанавливаю свойство AvatarSource, но изображение не отображается.

Я попытался восстановить UserControl через Listbox и у меня та же проблема, но когда я установил AvatarSource свойство в UserControl конструктора или метода UserControl_Loaded, корректно отображается изображение.

MainWindow.xaml.cs:

/// MainWindow::CheckBox_Checked() 

ListboxCustomItem itemUC = new ListboxCustomItem(); 
itemUC.AvatarSource = new BitmapImage(new Uri("pack://application:,,,/WindowSwitcher;component/Images/feca.png")); 

// Add custom item to the listbox 
VisualBindings.Items.Add(itemUC); 

... 

// Test for update the avatar image (custom item) 
(VisualBindings.Items.GetItemAt(0) as ListboxCustomItem).setImageSource("feca.png"); 
VisualBindings.InvalidateVisual(); 
NotifyPropertyChanged("VisualBindings"); 

Где я ошибаюсь?

Проект доступен на Codeplex по следующему адресу: https://windowbinding.codeplex.com/SourceControl/latest

(Каждый код этикетка на эту тему связана с файлом в CodePlex)

ответ

0

Я попытался восстановить UserControl через Listbox и У меня та же проблема

Ну, это одна проблема. Если вы связываете список объектов с ListBox и используете пользовательский UserControl для представления каждого элемента, вы хотите напрямую изменить объект, а не UserControl (который побеждает цель привязки).

То, что я делаю, я установил свойство Path на моих объектов и всякий раз, когда Path изменения свойств, я начинаю BackgroundWorker, который обрабатывает создавая BitmapSource из источника (путь к файлу, хотя, это может быть различным в вашем ситуация), а затем вручную установить источник изображения в UserControl, когда рабочий закончил (что сделано в UserControl).

Это позволяет:

  1. Генерирование изображения с помощью BackgroundWorker и
  2. Оставьте поколение изображения до элемента управления, который должен отображать его.

До тех пор, пока вы следуете этим простым рекомендациям, изображение должно отображаться в порядке. Если этого не произойдет, по крайней мере, будет легче отладить и посмотреть, где может возникнуть проблема.

Смежные вопросы