0

我花了好几天没有自己解决这个问题,这让我相信我不了解有关 xaml 和代码隐藏的一些非常基本的东西。我正在尝试使用 WPF 和 c# 在 ListView 中显示来自 ObservableCollection 的数据。

当我开始调试时,窗口会显示带有网格和标题的列表视图。有与应存在的项目数相等的可点击行,但这些项目显示为空白或空。我正在编写一个不完整的教程来尝试学习我的方法,代码如下:

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();           
    }   
}

名称列表.cs:

class NameList : ObservableCollection<PersonName>
{
    public NameList()
        : base()
    {
        Add(new PersonName("Willa", "Cather")); //enumerated? (firstName, lastName)
        Add(new PersonName("Isak", "Dinesen"));
        Add(new PersonName("Victor", "Hugo"));
        Add(new PersonName("Jules", "Verne"));
    }
}

人名.cs:

class PersonName
{
    private string firstname;
    private string lastname;

    public PersonName(string first, string last)
    {
        this.firstname = first;
        this.lastname = last;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我会包括 xaml,但我还没有想出如何在此处的问题中做到这一点,所以我会尽我所能把它拼出来:

ListView ItemsSource=""{Binding Source={StaticResource NameListData}}"

GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}"

GridViewColumn DisplayMemberBinding="{Binding Path=LastName}"

我只列出了实际的绑定,我不认为布局信息太重要,但如果我的假设有误,请告诉我。

4

3 回答 3

5

您为私有字段分配一个值

this.firstname

但绑定到属性

public string FirstName { get; set; }

这应该工作

public PersonName(string first, string last)
{
    this.Firstname = first;
    this.Lastname = last;
}
于 2013-02-08T20:35:29.313 回答
2

您的 MainWindow 将需要一个包含您的数据的属性,以便您可以绑定到

public partial class MainWindow : Window
{
    private NameList _nameList;

    public NameList NameList
    {
        get { return _nameList; }
        set
        {
            if (_nameList != value)
            {
                _nameList = value;
            }
         }
    }

    public MainWindow ()
    {
        InitializeComponent(); 

        NameList = new NameList();
    }
}

您的 PersonName 类需要分配属性(而不是成员),以便您可以绑定到它们:

public class PersonName
{
    public PersonName(string first, string last)
    {
        FirstName = first;
        LastName = last;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
}

在您的 XAML 中,您可以像这样绑定:

<ListView ItemsSource="{Binding NameList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Run Text="{Binding LastName}" /><Run Text=", " /><Run Text="{Binding FirstName}" />
            </TextBlock>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

因此,您的结果将如下所示:

在此处输入图像描述

于 2013-02-08T20:44:29.107 回答
0

所以我只是想通了,@LPL 引发的一闪而过的理解。

当我声明我的属性时,我没有将 get 和 set 值设置为私有字符串,因此当绑定调用它们时,它知道存在四个项目,但它们是空项目。现在的功能代码如下所示:

 public string FirstName
    {
        get {return firstname; }
        set{ firstname=value; }
    }

具有 LastName 的等效属性。对简单的问题感到高​​兴成为巨大的头痛。

于 2013-02-08T20:54:08.670 回答