WPF - 将列表框绑定到图像的ObservableCollection

时间:2011-03-10 21:55:21

标签: wpf image listbox binding observablecollection

这应该非常简单,但我不能让它起作用......

CustomItem是一个具有名为ThumbnailImage的属性的类 我试图将ObservableCollection绑定到ListBox以显示图像。这是我的代码:

public ObservableCollection<CustomItem> AvailableItems { get; set; }

 <ListBox Width="103" Height="480" ItemsSource="{Binding AvailableItems}">
    <ListBox.ItemTemplate>
       <DataTemplate>
          <Border BorderBrush="Black" BorderThickness="1">
             <ContentControl Content="{Binding Path=ThumbnailImage}" 
                                             Width="100" Height="100" />
          </Border>
       </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

CustomItem看起来像这样

    public class CustomItem
        public Image ThumbnailImage { get; set; }
    }

运行时,ListBox中没有任何内容出现。知道出了什么问题吗?谢谢!

- 编辑1 - 我想从调试中可以看出,当AvailableItems.Count == 5时,closet.Items.Count == 0我尝试添加ItemsSource =“{Binding AvailableItems,UpdateSourceTrigger = PropertyChanged}“但这没有用:(

- 编辑2 -

我在XAML中执行了以下操作

DataContext="{Binding RelativeSource={RelativeSource Self}}" 

相反,当我在代码隐藏中执行以下操作时,一切正常:

DataContext = this;

2 个答案:

答案 0 :(得分:3)

您发布的代码似乎没问题,所以问题必须是别的

  • ListBox是否具有正确的DataContext,以便它可以正确绑定到AvailableItems
  • 您是如何在代码中初始化Image的?

实施例

BitmapImage source = new BitmapImage();
source.BeginInit();
source.UriSource = new Uri(yourUriString, UriKind.RelativeOrAbsolute);
source.EndInit();

ThumbnailImage = new Image();
ThumbnailImage.Source = source;

我将您的代码粘贴到示例项目中,并且工作正常,在此处上传  http://www.mediafire.com/download.php?m99kv1uglrr31j9

将它与您的版本进行比较,看看您缺少什么

答案 1 :(得分:3)

我猜你也是:
1)没有初始化你的ObservableCollection
2)没有设置窗口的DataContext或
3)在将CustomItem添加到ObservableCollection并且尚未在CustomItem类上实现INotifyPropertyChanged之后,您正在设置图像。

您的代码加上这似乎对我有用:

    public MainWindow()
    {
        InitializeComponent();
        this.AvailableItems = new ObservableCollection<CustomItem>();
        Image i = new Image();
        BitmapImage src = new BitmapImage();
        src.BeginInit();
        src.UriSource = new Uri(@"C:\Users\Public\Pictures\Sample Pictures/Desert.jpg");
        src.EndInit();
        i.Source = src;
        i.Stretch = System.Windows.Media.Stretch.Fill;

        CustomItem ci = new CustomItem();
        ci.ThumbnailImage = i;

        this.AvailableItems.Add(ci);
    }


    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.DataContext = this;
    }