我的WPF应用程序出现问题,我的Listbox
包含UserControl
项目。
UserControl
有一个图像(图片上的红色方块),Source
绑定到ImageSource
属性,如下所示:
<Image Name="Avatar" Height="56" Width="56" DockPanel.Dock="Left" Source="{Binding AvatarSource}"/>
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::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 :(得分:0)
我试图通过列表框检索UserControl,我遇到了同样的问题
嗯,这是一个问题。如果要将对象列表绑定到ListBox并使用自定义UserControl来表示每个项目,则需要直接更改对象,而不是UserControl(这会破坏绑定的目的)。
我所做的是在我的对象上设置一个名为Path
的属性,每当Path
属性发生变化时,我就会启动一个Backgroundworker,它处理从源创建一个BitmapSource(文件路径,尽管,这可能在您的情况下有所不同),然后在工作完成时手动设置UserControl中的图像源(在UserControl中完成)。
这使我们能够:
只要遵循这些简单的指导原则,图像就可以正常显示。如果没有,至少可以更容易地调试并查看可能出现问题的位置。