列表框不显示数据(与项目模板绑定)

时间:2013-11-24 05:30:38

标签: c# wpf list binding listbox

我知道这基本上是一堆人的重复问题,但是我遇到了困难,我的组合框列出了hdds,点击时他们应该用图片填充列表框,这要归功于之前的帮助,这样运行没有错误,除了该列表框没有显示任何内容,我将它绑定在项目模板等中,因此我不知道为什么没有显示

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();

        DataContext = this;
    }


    private void HDDSelectionBox_Loaded(object sender, RoutedEventArgs e) //ComboBox Lists Local Hardrives 
    {
        string[] drives = Environment.GetLogicalDrives(); //Drive Letters, Into A String Array

        foreach (string drive in drives)
        {
            HDDSelectionBox.Items.Add(drive); //Adds Each Drive Letter As A Combox Box Item
        }
    }



    public List<Photos> LoadImages ///List Retrieves and Loads Photos
    {
        get
        {
            List<Photos> images = new List<Photos>();
            if (HDDSelectionBox.SelectedItem != null) //If a item has been selected
            {

                foreach (string filename in System.IO.Directory.GetFiles(HDDSelectionBox.SelectedItem.ToString()))
                {
                    try
                    {
                        images.Add( //Add To List
                        new Photos(
                            new BitmapImage(
                                new Uri(filename)),
                                System.IO.Path.GetFileNameWithoutExtension(filename)));
                    }
                    catch { ; } //Skips Any Image That Isn't Image/Cant Be Loaded
                }
            }
            return images;

        }
    }

}


public class Photos
{
    private ImageSource _image;
    private string _name;

    public Photos(ImageSource image, string name)
    {
        _image = image;
        _name = name;
    }

    public override string ToString()
    {
        return _name;
    }

    public ImageSource Image
    {
        get { return _image; }
    }

    public string Name
    {
        get { return _name; }
    }

   } // END MyImage CLASS

}

XAML

<Window.Resources>
    <DataTemplate x:Key="MyImageTemplate">
        <StackPanel>
            <Image 
               Source="{Binding Image}" Width ="100" Height="100" />
            <TextBlock Text ="{Binding Name}" Width = "100" />
        </StackPanel>
    </DataTemplate>
</Window.Resources>

<Grid>



    <DockPanel LastChildFill="False">
        <ListBox
            Name="ImageListBox"
            DockPanel.Dock = "Right"
            ItemsSource = "{Binding LoadImages}"
            ItemTemplate="{StaticResource MyImageTemplate}" 
            Width="200"/>
        <ComboBox Width="80" Height="50" DockPanel.Dock="Top" Name="HDDSelectionBox" Loaded="HDDSelectionBox_Loaded" ></ComboBox>
        </DockPanel>
    </Grid>

2 个答案:

答案 0 :(得分:0)

我认为您应该将组合框的ItemsSource绑定到SelectedItem并提供一些Converter来将所选项目转换为相应的List<Photo>。否则,当组合框的LoadImages发生更改时,您必须通知SelectedItem属性的更改。尝试以下代码(在过程代码和XAML代码中修改):

代码

public class SelectedItemToLoadImagesConverter : IValueConverter {
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture){
        List<Photos> images = new List<Photos>();
        if (value != null) //If a item has been selected
        {
            foreach (string filename in System.IO.Directory.GetFiles(value.ToString()))
            {
                try
                {
                    images.Add( //Add To List
                    new Photos(
                        new BitmapImage(
                            new Uri(filename)),
                            System.IO.Path.GetFileNameWithoutExtension(filename)));
                }
                catch { ; } //Skips Any Image That Isn't Image/Cant Be Loaded
            }
        }
        return images;
  }
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){
    throw new NotImplementedException();
  }
}

XAML代码

<Window.Resources>
  //...
  <local:SelectedItemToLoadImagesConverter x:Key="imagesConverter"/>
</Window.Resources>
<DockPanel LastChildFill="False">
    <ListBox
        Name="ImageListBox"
        DockPanel.Dock = "Right"
        ItemsSource = "{Binding ElementName=HDDSelectionBox,Path=SelectedItem,Converter={StaticResource imagesConverter}}"
        ItemTemplate="{StaticResource MyImageTemplate}" 
        Width="200"/>
    <ComboBox Width="80" Height="50" DockPanel.Dock="Top" Name="HDDSelectionBox" Loaded="HDDSelectionBox_Loaded" ></ComboBox>
    </DockPanel>
</Grid>

请注意,您可以删除代码中的LoadImages属性。另请注意,我使用local前缀作为项目命名空间的引用,其中定义了类SelectedItemToLoadImagesConverter,我希望您知道如何在XAML代码中定义xmlns。< / p>

答案 1 :(得分:0)

好吧,我先问你一个简单的问题:如果我们 假设 你只有C:驱动器,那么C:\文件夹是否包含任何图像?

如果是,那么我们将讨论可能在代码中的下一个问题。

如果不是,那么显然,你没有任何东西可以展示。但是,如果您在子文件夹中有图像,则可能需要更改对API GetFiles的使用。正确的应该从所有子文件夹中获取文件:

foreach (string filename in System.IO.Directory.GetFiles(
                            value.ToString(),
                            "*.png", //assuming that you want PNG images only
                            System.IO.SearchOption.AllDirectories))

有关GetFiles的更多信息,here

如果这样可以解决您的问题,那么您可能需要对其进行增强以使用图像枚举,因为在整个驱动器中搜索文件可能需要相当长的时间,在此期间您的应用将无法响应。