WPF ListView 数据绑定无法绑定!

3

一个简单的 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; }
}

在页面的构造函数中(在InitializeComponent之前),我填充了myCollection,但列表为空

我在其他页面上有完全相同的配置,它可以正常工作 - 我错过了什么吗?

任何帮助都将不胜感激!

4个回答

4

将页面的DataContext设置为页面本身:

this.DataContext = this;

谢谢,它可以工作!不过我不清楚为什么在其他页面中没有明确执行它也能工作。 - JohnIdol

4

托马斯说...或者...

你所忽略的是绑定实际上是检查DataContext。你可以通过多种方式设置不同的源。

这样想...绑定要在哪里查找?绑定只是一个类,它并不是万能的。你必须告诉它在哪里查找。默认情况下,这是DataContext。DataContext在UI的逻辑树元素之间共享,在树中较低的项目能够看到树中较高的DataContext,甚至可以覆盖这个值对于比自己低的项目。

在您的情况下,您需要一个位于Page上而不是DataContext上的值。您必须告诉Binding如何找到它。您可以通过RelativeSource属性来实现这一点。

{Binding MyCollection RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}

这是三个标记辅助程序Binding、RelativeSource和Type的组合。
RelativeSource会在当前位置找到树中的对象。在这种情况下,我们正在查找一个祖先(向上查找)。RelativeSource沿着树向上走,寻找第一个Page类型的对象。一旦找到它,它就会将其返回给Binding。Binding然后检查此对象是否具有MyCollection属性。

把一个加到你的分数里,Will.. 使用 this.DataContext = this 是不对的。如果你要把控件当作ViewModel使用,那还有ViewModel的意义吗? - Arcturus

2
这里是一个完整的示例,展示了如何将ListView绑定到ObservableCollections并使用Commands对它们进行操作。希望这可以帮助您。

0

我认为问题在于ListView需要像GridView这样的容器。这就是为什么ListView可以允许非线性排列项目,而ListBox则不行。

可以把它看作是:

     ListView = Layout Coordinator

         GridView = Layout Style

               Elements = Items to be displayed

除非您打算以列表外的任何方式显示您的项目,否则请使用 ListBox。

(附注:请忽略高亮)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接