Listview显示“空”行

时间:2013-02-08 20:26:56

标签: c# wpf listview data-binding

我花了几天时间没有自己解决这个问题,这使我相信我不了解xaml和代码隐藏的基本内容。我试图使用WPF和c#在ListView中显示来自ObservableCollection的数据。

当我开始调试时,窗口会显示列表视图,其中包含网格和标题。可点击的行等于应该存在的项目数,但这些项目显示为空白或空白。我正在研究一个不完整的教程,试图通过这个来学习我的方法,代码如下:

MainWindow.xaml.cs:

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

NameList.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"));
    }
}

PersonName.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}"

我只列出了实际的绑定,我并不认为布局信息太重要了,但请告诉我这个假设是否错误。

3 个答案:

答案 0 :(得分:5)

您为私人字段

分配值
this.firstname

但绑定到属性

public string FirstName { get; set; }

这应该有效

public PersonName(string first, string last)
{
    this.Firstname = first;
    this.Lastname = last;
}

答案 1 :(得分: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>

所以你的结果会是这样的:

enter image description here

答案 2 :(得分:0)

所以我只是想通了,@LPL引发了一丝理解。

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

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

具有LastName的等效属性。欢迎简单的问题成为巨大的麻烦。