【问题标题】:How to: Fill a ListView by using C# instead of using XAML如何:使用 C# 而不是 XAML 填充 ListView
【发布时间】:2014-07-08 15:11:54
【问题描述】:

如何:使用 C# 而不是 XAML 填充 ListView

我想使用 C# (WPF) 填充 ListView,而不是使用 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(这里:ImageLabel)。之后,我会将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);
        }
    }

【问题讨论】:

  • 正确的方法是将 DataTemplate 分配给 ListView 的 ItemTemplate 属性,并将 ItemsSource 属性绑定到数据项的集合。请参阅 MSDN 上的 Data Templating Overview 文章。标准的 WPF 书籍也详细解释了这一点。
  • 如果您将ListViewItemsSource 绑定到视图模型中的集合,则无需知道ListView 中的元素数量。您只需要定义该列表中的项目如何在视觉上表示的模板,然后可以进一步将项目的属性绑定到 UI 元素的属性。
  • 谢谢,Clemens 和 Mashton。
  • @Exception 你真的不应该那样做。 WPF 提供极其强大的数据模板,这将大大简化并因此改进您的应用程序。阅读我在之前评论中链接的文章。

标签: c# xaml listview add dockpanel


【解决方案1】:

您可以使用以下代码创建您的列表视图,使用DockPanel 的静态SetDock 方法设置停靠位置。

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);
}

【讨论】:

  • 谢谢,它有效!完美的代码。请告诉我,为什么你使用var 而不是ImageLabel、...? --> 请告诉我,如何使用从我的文件中读取的文本作为LabelContent
  • 在你的 foreach 循环中你有 foreach(item in File.ReadAllLines(...)) 项目是该行的字符串。所以你可以使用:label.Content = item;
  • 我使用 var 因为它更易于阅读,代码更简洁,ListViewItem item = new ListViewitem(); 在这一行中它两次声明它是 ListViewItem,但如果你声明一次,它仍然很清楚,但是您的代码不那么混乱。对于所有对象,我使用 var 除了基础知识(int、double、string、bool、char 等),因为对于您从未使用过的基础知识,例如int something = new int(5);,所以一旦我使用int something = 5;,请继续说明它@
  • -1 你的回答误导了 OP,由于没有使用正确的方法(XAML + DataBinding)而不是你发布的这个可怕的黑客作为答案,他现在真的很难完成任务。跨度>
  • @HighCore 我按要求回答了 OP 的问题,OP 已经准备好在评论中收到有关数据绑定的建议,如果 OP 选择深入研究数据绑定并遇到问题,他可以随时在这里提问。这个问题解决了一个问题,我提出了一个解决方案。我还用下降解决方案回答了一个问题,stackoverflow.com/a/12820444/637425 但该答案未被接受,因为直接解决该问题的答案已被接受。所以我明白你的意思,但这就是 OP 要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多