2009-08-18 10 views
3

簡単なWPFのListView:WPF ListView Databindバインドされていません!

<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の前)しかし、リストが空になる

私は他のページに全く同じ設定をしていますが、うまくいきます - 何が欠けていますか?

答えて

4

ページ自体へのページのDataContextのを設定します。

this.DataContext = this; 
+0

ありがとうございます!私は明示的にそれをやっていない他のページで動作する理由は明らかではありません – JohnIdol

4

トーマスは言った...かどう...

何が欠けていることは、実際のDataContextを検討している結合点であります。ただし、ソースをさまざまな方法で設定できます。

このように考える...バインディングはどこにありますかMyCollection?バインディングは単なるクラスです。それはすべてを知っているわけではありません。あなたはどこを見るか教えてください。既定では、これはDataContextです。 DataContextは、UIの論理的なツリー要素間で共有されます。ツリーの下位のアイテムはツリーの上位のDataContextを表示できます。

Pageにある値を、DataContextに設定したい場合があります。これを見つける方法をバインディングに伝えなければなりません。 RelativeSourceプロパティでこれを行うことができます。

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

これは、3つのマークアップヘルパーBinding、RelativeSource、Typeの組み合わせです。

RelativeSourceは、ツリー内の現在の位置を基準にしてオブジェクトを検索します。この場合、私たちは祖先を探しています(私たちは木を探しています)。 RelativeSourceは、ツリーの上を歩き、ページタイプの最初のオブジェクトを探します。これを見つけたらバインドに返します。 バインドは、このオブジェクトでプロパティMyCollectionを調べます。ここで

+0

あなたにプラス1つWill ..これはちょうどthis.DataContext = thisを使用するのは間違っています。あなたが行っている場合、viewmodelを持つ点あなたのコントロールをビューモデルとして使用してください。 – Arcturus

0

私は、リストビューはコンテナとしてグリッドビューのようなものをとると考えています。これは、リストビューがリストボックスとは異なり、項目の非線形配置を可能にする方法です。あなたは、リストよりも、とにかく他のあなたの項目を表示するリストボックスを使用する場合を除き

 ListView = Layout Coordinator 

     GridView = Layout Style 

       Elements = Items to be displayed 

としてそれについて考えてみよう。

(p.s.無視のハイライト)

関連する問題