未显示WPF列表框自定义项目图像

时间:2015-10-27 18:52:10

标签: c# wpf xaml user-controls listbox

我的WPF应用程序出现问题,我的Listbox包含UserControl项目。

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属性时1}}方法,图像正确显示。

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中的文件)

1 个答案:

答案 0 :(得分:0)

  

我试图通过列表框检索UserControl,我遇到了同样的问题

嗯,这是一个问题。如果要将对象列表绑定到ListBox并使用自定义UserControl来表示每个项目,则需要直接更改对象,而不是UserControl(这会破坏绑定的目的)。

我所做的是在我的对象上设置一个名为Path的属性,每当Path属性发生变化时,我就会启动一个Backgroundworker,它处理从源创建一个BitmapSource(文件路径,尽管,这可能在您的情况下有所不同),然后在工作完成时手动设置UserControl中的图像源(在UserControl中完成)。

这使我们能够:

  1. 使用BackgroundWorker生成图像,
  2. 将图像生成保留到要显示它的控件上。
  3. 只要遵循这些简单的指导原则,图像就可以正常显示。如果没有,至少可以更容易地调试并查看可能出现问题的位置。