2009-09-22 37 views
40

[OK]を私は他の質問を見て、私の答えを得るように見えなかったので、ここに誰かができればうれしい。WPF Combobox DisplayMemberPath

DisplayMemberPathプロパティがアイテムにバインドされないのはなぜですか?

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" DisplayMemberPath="{Binding Name}" SelectedItem="{Binding Prompt}"/> 

トレース出力は、IEnumerableをIEnumerableをしませ内の実際の項目を保持するクラスにバインドしようとしていることを示しています。私はxamlに束を追加せずにコンボボックスを埋める簡単な方法として混乱しています。

これはitemssource内のオブジェクトのToString()を呼び出します。私はこれで、その周りの仕事があります。

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" SelectedItem="{Binding Prompt}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

をしかし、私の意見では、このような単純な作業のためにあまりにも多くのです。親族関係のバインディングを使用することはできますか?

答えて

115

DisplayMemberPathは、各アイテムの表示文字列プロパティへのパスを指定します。あなたの場合は"{Binding Name}"ではなく"Name"に設定します。

+0

あなたは本当に素晴らしいです、私は明らかに逃したとは思えません。 – Jose

+0

お手伝いをしてうれしい! (SOを満たすためにいくつかの詰め物があります) –

+0

ここで同じ問題があります。ありがとう - 再び救助に! –

7

あなたはクラスのデータにバインドされていません。インスタンスに「item.Name == "steve"」というデータがある場合は、メンバー「name」によって指定されたクラスメンバーからデータを取得するように指示しています。 item.steveから。

これを機能させるには、MemberPathからバインディングを削除する必要があります。それをMemberPath = "Name"に変更します。これは、メンバー「名前」からデータを取得するよう指示します。そうすればitem.Nameと呼ばれ、item.steveにはなりません。

5

MemberPath="{Binding Name}"MemberPath="Name"に変更する必要があります。その後、それは動作します。

5

DisplayMemberPathを削除し、TextBlockでパスを設定できます。
DisplayMemberPathは、実際にItemTemplateがない場合に使用します。
また、ItemTemplateを削除してDisplayMemberPathを使用することもできます。この場合、基本的にTextBlockが作成されます。 両方をお勧めしません。

<TextBlock text="{Binding Path=Name, Mode=OneWay}" 
2

また、DisplayMemberPathを設定する必要はありません。 PromptListにあるオブジェクトにオーバーライドToString()をインクルードするだけで済みます。

class Prompt { 
    public string Name = ""; 
    public string Value = ""; 

    public override string ToString() { 
     return Name; 
    } 
} 

ToString()が自動的に呼び出され、クラスのNameパラメータが表示されます。これはコンボボックス、リストボックスなどで機能します。

+5

これは良い解決策ではありません。 ToString()はデフォルトとフォールバックの戦略であり、GUIに情報をもたらす標準ではありません。 –

関連する問題