Практическое руководство. Заполнение ListView с помощью C# вместо XAML

Как заполнить ListView с помощью C# вместо XAML

Я хотел бы заполнить ListView с помощью С# (WPF), а не с помощью XAML. Причина этого в том, что мы не знаем количество элементов перед выполнением.

Это мой рабочий код XAML:

<ListView Name="listView_BusinessContacts" SelectionMode="Single">
                <ListViewItem Selected="ListViewItem_Selected">
                    <DockPanel DockPanel.Dock="Top" Name="dockPanel_1">
                        <Image DockPanel.Dock="Left" Source="/X;component/Images/folder.png" Stretch="None" />
                        <Label Content="Test 123" DockPanel.Dock="Right" Name="label_1" />
                    </DockPanel>
                </ListViewItem>
            </ListView>

Моя идея состоит в том, чтобы сначала создать файл ListViewItem. После этого я мог создать файл DockPanel. Но теперь я не знаю, как добавить два элемента в DockPanel (здесь: Image и Label). После этого я добавлял DockPanel к ListViewItem, а затем добавлял ListViewItem к ListView.

Я надеюсь, что вы понимаете, что я хочу сделать.

Решение SynerCoder:

public void SetListViewItems()
    {
        foreach (var item in File.ReadAllLines(@"C:\Companies\Companies.txt", Encoding.UTF8))
        {
            Image image = new Image();
            image.Source = new BitmapImage(new Uri(@"Images\folder.png", UriKind.Relative));
            image.Stretch = Stretch.None;

            Label label = new Label();
            label.Content = "Test 123";

            DockPanel.SetDock(image, Dock.Left);
            DockPanel.SetDock(label, Dock.Right);

            DockPanel dockPanel = new DockPanel();
            dockPanel.Children.Add(image);
            dockPanel.Children.Add(label);

            ListViewItem listViewItem = new ListViewItem();
            listViewItem.Content = dockPanel;

            listView_BusinessContacts.Items.Add(listViewItem);
        }
    }

person gpuk360    schedule 20.05.2014    source источник
comment
Правильным подходом было бы назначить DataTemplate свойству ItemTemplate ListView и привязать свойство ItemsSource к набору элементов данных. См. статью Обзор шаблонов данных на сайте MSDN. Стандартные книги WPF также подробно объясняют это.   -  person Clemens    schedule 20.05.2014
comment
Если вы привязываете ItemsSource из ListView к коллекции в вашей модели представления, вам не нужно знать количество элементов, которые будут в ListView. Вам просто нужно определить шаблон визуального представления элемента в этом списке, а затем можно дополнительно связать свойства элемента со свойствами элементов пользовательского интерфейса.   -  person Mashton    schedule 20.05.2014
comment
Спасибо, Клеменс и Маштон.   -  person gpuk360    schedule 20.05.2014
comment
@Exception Вы действительно не должны делать это таким образом. WPF предоставляет чрезвычайно мощные шаблоны данных, которые значительно упростят и, таким образом, улучшат ваше приложение. Прочтите статью, ссылку на которую я дал в предыдущем комментарии.   -  person Clemens    schedule 20.05.2014


Ответы (1)


Вы можете использовать следующий код для создания вашего списка, используйте статический метод SetDock для DockPanel для установки позиций стыковки.

var listView = new ListView();
foreach (var item in something)
{
    var image = new Image();
    image.Source = ...;
    image.Stretch = Stretch.None;

    var label = new Label();
    label.Content = "Test 123";

    DockPanel.SetDock(image, Dock.Left);
    DockPanel.SetDock(label, Dock.Right);

    var dockPanel = new DockPanel();
    dockPanel.Children.Add(image);
    dockPanel.Children.Add(label);
    var item = new ListViewItem();
    item.Content = dockPanel;

    listView.Items.Add(item);
}
person SynerCoder    schedule 20.05.2014
comment
Спасибо, это работает! Идеальный код. Просто скажите, пожалуйста, почему вы используете var вместо Image, Label, ... ? --› Подскажите пожалуйста, как мне использовать прочитанный текст из моего файла в качестве Content из Label? - person gpuk360; 20.05.2014
comment
в вашем цикле foreach у вас есть элемент foreach(item in File.ReadAllLines(...)) - это строка строки. поэтому вы можете использовать: label.Content = item; - person SynerCoder; 20.05.2014
comment
и я использую var, потому что его легче читать, он делает код более чистым, ListViewItem item = new ListViewitem(); в этой строке дважды указывается, что это ListViewItem, но если вы укажете его один раз, он все равно будет понятен, но ваш код менее загроможден. Со всеми объектами я использую var, кроме основных (int, double, string, bool, char и т. д.), потому что с основными вы никогда не используете, например, int something = new int(5);, поэтому продолжайте указывать это, когда я использую int something = 5; - person SynerCoder; 20.05.2014
comment
-1 ваш ответ ввел в заблуждение ОП, который сейчас действительно изо всех сил пытается добиться цели из-за того, что не использует правильный подход (XAML + DataBinding), в отличие от этого ужасного хака, который вы опубликовали в качестве ответа. - person Federico Berasategui; 23.05.2014
comment
@HighCore Я ответил на вопрос ОП, как его спросили, ОП все готово, получил предложения в комментариях о привязке данных, если ОП решит погрузиться в привязку данных и столкнется с проблемами, он всегда может задать здесь. Этот вопрос касается проблемы, и я предложил решение. Я также однажды ответил на вопрос с помощью нисходящего решения, stackoverflow.com/a/12820444/637425, но этот ответ не был принят потому что был принят ответ, который непосредственно касался проблемы. Итак, я понимаю вашу точку зрения, но это то, о чем просил ОП. - person SynerCoder; 23.05.2014