2012-05-17 5 views
0

Я связывание ListBox к ObservableCollection предметов, которые имеют Image свойство, которое возвращает Image. Однако, вместо того, чтобы получить список изображений, я получаю это:Использования DisplayMemberPath для выбора изображения при связывании ListBox к ObservableCollection

enter image description here

Любые предложения?

Xaml:

<Window x:Class="ObservableCollectionDirectoryListBox.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <DockPanel> 

     <ListBox DockPanel.Dock="Top" 
       Name="listBox" 
       ItemsSource="{Binding Source={StaticResource infos}}" 
       DisplayMemberPath="Image"/> 

    </DockPanel> 

</Window> 

C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Collections.ObjectModel; 
using System.IO; 
using System.Threading; 

namespace ObservableCollectionDirectoryListBox 
{ 
    public class ImageFileInfo : FileSystemInfo 
    { 
     public Image Image 
     { 
      get 
      { 
       var image = new Image() { Width = 100 }; 

       var bitmapImage = new BitmapImage(); 
       bitmapImage.BeginInit(); 
       bitmapImage.UriSource = new Uri(this.FullName); 
       bitmapImage.DecodePixelWidth = 100; 
       bitmapImage.EndInit(); 

       image.Source = bitmapImage; 

       return image; 
      } 
     } 

     public ImageFileInfo(string path) 
      : base() 
     { 
      FullPath = path; 
     } 

     public override void Delete() 
     { 
      throw new NotImplementedException(); 
     } 

     public override bool Exists 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override string Name 
     { 
      get { throw new NotImplementedException(); } 
     } 
    } 

    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      var infos = new ObservableCollection<ImageFileInfo>(); 

      Resources.Add("infos", infos); 

      InitializeComponent(); 

      new DirectoryInfo(@"C:\Users\dharmatech\Pictures\From dharmatech\Camera roll") 
      .GetFiles("*.jpg") 
      .ToList() 
      .ForEach(file => infos.Add(new ImageFileInfo(file.FullName))); 

      var fileSystemWatcher = 
       new FileSystemWatcher(@"C:\Users\dharmatech\Pictures\From dharmatech\Camera roll") 
       { EnableRaisingEvents = true }; 

      var context = SynchronizationContext.Current; 

      fileSystemWatcher.Created += (s, e) => 
       context.Post(val => 
       { 
        if ((File.GetAttributes(e.FullPath) & FileAttributes.Normal) == 
         FileAttributes.Normal) 
         infos.Add(new ImageFileInfo(e.Name)); 
       }, true); 
     } 
    } 
} 

ответ

3

Вы не должны действительно иметь коллекцию Images, которая является контрольным и не принадлежит там, а она должна быть коллекция ImageSource , который затем в (ListBox.ItemTemplate) может быть связан с SourceImage.

+0

Hi H.B. Я просматривал книгу WPF 4 Unleashed. Он предлагает что-то в соответствии с тем, что вы описали выше. Я просто пытался использовать другой подход для экспериментов. Даже если это не лучшая практика, я хотел бы понять, почему изображения не появляются. – dharmatech

+0

@dharmatech: Предположительно, 'ListBox' создает' TextBox' и связывает 'Text' с указанным' DisplayMemberPath', который вызывает 'ToString' для вызова' Image', который возвращает имя типа. Я понятия не имею, почему они не просто связывают «Контент» с ContentPresenter. Вы можете проверить эту гипотезу, изучив «VisualTree», используя «VisualTreeHelper» (или какой-то внешний инструмент, такой как Snoop). –

+0

ОК, спасибо за наконечник H.B. – dharmatech

1

Я смог решить проблему, используя DataTemplate. Вот код Xaml для ListBox:

<ListBox DockPanel.Dock="Top" 
     Name="listBox" 
     ItemsSource="{Binding Source={StaticResource infos}}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Image Source="{Binding Path=FullName}" Height="35"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
Смежные вопросы