一个简单的WPF ListView:
<ListView Name="recordContainer" ItemsSource="{Binding Path=MyCollection}">
<GridView>
<GridViewColumn Width="260" Header="Name" DisplayMemberBinding="{Binding Path=Name}"/>
<GridViewColumn Width="100" Header="Value" DisplayMemberBinding="{Binding Path=Value}"/>
</GridView>
</ListView>
MyCollection是我的页面上的一个属性:
public ObservableCollection<MyData> MyCollection
{
get
{
return myCollection;
}
}
这是我的数据对象:
public class MyData
{
public string Name { get; set; }
public string Value { get; set; }
}
我在页面的构造函数中填充myCollection(在InitializeComponent之前)但是列表空白!
我在其他页面上有完全相同的配置,它运行正常 - 我缺少什么?
任何帮助表示赞赏!
答案 0 :(得分:4)
将页面的DataContext设置为页面本身:
this.DataContext = this;
答案 1 :(得分:4)
托马斯说的......或......
您缺少的是绑定实际上正在检查DataContext。但是,您可以通过多种方式设置源。
以这种方式思考......寻找 MyCollection 的绑定在哪里?绑定只是一个类;并不是所有人都知道。你必须告诉它在哪里看。默认情况下,这是 DataContext 。 DataContext 在UI的逻辑树元素之间共享,树中较低的项目能够在树中看到更高的DataContexts,甚至可以覆盖低于它们的项目的此值。
在您的情况下,您需要一个位于页面上的值,而不是 DataContext 。你必须告诉Binding如何找到它。您可以通过RelativeSource属性执行此操作。
{Binding MyCollection RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}
这是三个标记助手Binding,RelativeSource和Type的组合。
RelativeSource 在树中找到相对于当前位置的对象。在这种情况下,我们正在寻找一个祖先(我们正在寻找树)。 RelativeSource 走向树,寻找第一个类型为Page的对象。找到后,会将其返回绑定。 绑定然后检查此对象的属性 MyCollection 。
答案 2 :(得分:2)
此处:http://simplesample.site90.com/wpf_binded_listview.php
是一个完整的示例,显示了ListView与ObservableCollection的绑定并使用命令对它们进行操作。
希望这有帮助。
答案 3 :(得分:0)
我认为问题在于listview将容器视为gridview。这就是列表视图如何允许项目的非线性排列,而不像列表框。
将其视为
ListView = Layout Coordinator
GridView = Layout Style
Elements = Items to be displayed
除非您打算以列表以外的方式显示项目,否则请使用ListBox。
(p.s。无视突出显示)