2013-02-08 140 views
0

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

当我开始调试时,窗口显示列表视图,网格和标题。可点击的行数等于应该在那里的项目数量,但项目显示为空白或空白。我工作过一个不完整的教程,试图通过这种学习我的方式,代码如下:

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,但我还没有想出如何在questi中做到这一点就在这里,所以我就讲出来,尽我所能:

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

GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}" 

GridViewColumn DisplayMemberBinding="{Binding Path=LastName}" 

我只列出的实际绑定,我没想到的布局信息太重要了,但让我知道,如果我这个假设是错误的。

+0

假设您使用的是VS,您可能会在Visual Studio的输出窗口中收到绑定错误消息。他们说什么? – PhoenixReborn 2013-02-08 20:30:43

+0

你在哪里实例化NameListData? – Mash 2013-02-08 20:32:49

+0

@Phoenix,我没有在我的输出窗口中看到任何错误。所有东西都没有投诉编译,它只显示空行。 – spugm1r3 2013-02-08 20:36:16

回答

0

所以我只是发现了它,这是@LPL引发的一种理解。

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

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

具有与LastName相同的属性。喜欢简单的问题成为头痛的问题。

5

您的值分配给私人领域

this.firstname 

但绑定到财产

public string FirstName { get; set; } 

这应该工作

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

你的回答抛出了一些错误,但它使我走上了正确的道路。感谢您的灵感! – spugm1r3 2013-02-08 20:55:16

+2

@ spugm1r3如果你认为这会让你走向正确的方向,你应该将它标记为“答案”...... – 2013-04-11 04:54:14

2

你的主窗口将需要与您的数据,这样的属性你可以绑定到

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

+0

令人沮丧的是,我花了很多时间试图理解数据绑定,我的问题在于xaml。有时你不能依赖于错误和例外,因为你的代码有问题。 – spugm1r3 2013-02-08 21:01:08

+0

它总是你最后期待的东西;) – TrueEddie 2013-02-09 00:30:12

+0

你知道我现在觉得多么愚蠢吗?我花了最后3个小时左右想知道为什么我的darn listview是空白的... duhhhhhh因为我没有得到和设置... !!!谢谢! – Tim 2016-11-08 18:31:18