Как в C# WPF ListView динамически добавить картинку?

277
20 июля 2018, 18:50

Имеется ListView, как отобразить картинки (.bmp) и название файла, из любой выбранной папки

у меня ListView, а не ListBox у меня картинки надо отображать , а не иконки к ним

Answer 1

Уважаемый, вот я вам дал пример, где показывается как работать с MVVM, грамотная привязка данных и изменение элемента. Вам лишь оставалось поменять контрол на свой и чуть переписать заполнение данных. Ну раз вы это не смогли сделать, то давайте разбираться...

  1. Нам понадобится ViewModel нашего объекта, который будет лежать в коллекции. Что нам нужно в нем? Наверно название и путь. Давайте напишем (не забываем, что привязка осуществляется к свойствам, а не полям!):

    public class ImageViewModel
    {
        public ImageViewModel(string name, string path)
        {
            Name = name;
            Path = path;
        }
        public string Name { get; set; }
        public string Path { get; set; }
    }
  2. Далее нам понадобится некая ViewModel, которая будет отвечать за наш основной контент. Что в ней должно быть? Хм, коллекция с нашими объектами и ее заполнение. Пишем:

    public class MainViewModel
    { 
        public ObservableCollection<ImageViewModel> Images { get; set; } = new ObservableCollection<ImageViewModel>();
        public MainViewModel()
        {
            var dir = Directory.GetFiles("D:\\Images", "*.jpg");
            foreach (var file in dir)
            {
                var fileInfo = new FileInfo(file);
                Images.Add(new ImageViewModel(fileInfo.Name, fileInfo.FullName));
            }
        }
    }

Как тут все работает: Мы объявили пустую ObservableCollection, далее я для примера в конструкторе заполняю ее. Сначала мы с помощью Directory.GetFiles берем все .jpg файлы в нужной директории (выдаст string[]), далее пробегаем по нему циклом, где каждую итерацию мы получаем с помощью FileInfo информацию о файле, ну и заносим в нашу коллекцию данные.

  1. Привяжем это все, я прям в MainWindow буду писать (вам советую до инициализации окна это делать).

    private MainViewModel MainViewModel { get; set; } = new MainViewModel();
    public MainWindow()
    {
        InitializeComponent();
        DataContext = MainViewModel;
    }
  2. Ну и остается View. ListView состроит из GridView, который содержит в себе GridViewColumn. Одну колонку нам трогать не нужно, оставим по стандарту, а вторую переопределим с помощью GridViewColumn.CellTemplate и добавим туда объект Image. Получаем в итоге что то вроде:

    <ListView ItemsSource="{Binding Images}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="200" Header="Название" DisplayMemberBinding="{Binding Name}"  />
                <GridViewColumn Width="140" Header="Изображение">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Image Source="{Binding Path}" MaxHeight="100" Stretch="UniformToFill"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

Все. Запускаем:

Как по мне с тем вопросом - одно и тоже, но раз не понятно...
В общем, удачи в изучение c#!

READ ALSO
Не добавляется элемент в XML

Не добавляется элемент в XML

Не добавляется элемент в XML-базуПробую так:

213
Игральные карты — пасьянс

Игральные карты — пасьянс

Пишу консольную программку на c#, задание такое: Создать класс колоду картСоздать конструкторы колоды должны инициализировать колоду как...

302
Как использовать две базы данных в проекте ASP.NET MVC?

Как использовать две базы данных в проекте ASP.NET MVC?

Есть основная база данных PostgreSQL, требуется создать программно ее локальную копию, чтоб была возможность производить над ней все те же операции,...

191
Считать из файла пароль PowerShell + C#

Считать из файла пароль PowerShell + C#

Есть такой скрипт PowerShell

221