web-dev-qa-db-ja.com

WPFコンボボックス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>

しかし、私の意見では、このような単純なタスクには多すぎます。 relativesourceバインディングを使用できますか?

56
Jose

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

133
Ben M

クラス内のデータにバインドしておらず、メンバー「name」によって名前が付けられたクラスメンバーからデータを取得するように指示しているため、インスタンスにitem.Name == "steve"がある場合、データを取得しようとしていますitem.steveから。

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

8
Muad'Dib

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

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

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

5
Emu

または、DisplayMemberPathを設定する必要はありません。 PromptListにあるオブジェクトに、オーバーライドToString()を含めることができます。このような:

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

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

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

2
JJ_Coder4Hire