2011-07-06 20 views
1

Personクラスから派生したオブジェクトのコレクションがあり、このコレクションをListViewのItemsSourceにバインドしたいとします。WPFリストビュー表示コンバーター

ListViewアイテムに表示する文字列を指定します。この文字列は、派生クラスで見つかったプロパティのコンポジットです。

また、ビューモデルのListViewのSelectedItemをPerson型のプロパティにバインドしたいとします。

表示文字列のコンバーターが必要ですが、コンポジット表示文字列を生成するためにItemsSource内のアイテムにバインドする方法が不明です。

誰でも私にポインタを与えることはできますか?

ありがとうございました。

答えて

1

複合表示文字列を返すには、派生クラスのToString()メソッドを上書きするか、アイテム全体を提案して渡すようにConverterを作成します。コンバータは、アイテムが指定されたタイプであるかどうかをチェックし、そうであれば、必要なプロパティの文字列を作成します。あなたがStringConverterを必要といけない

+0

これは私が(オーバーライドToStringメソッド())やってしまったものですので、お礼を。コンバーターをアイテム全体に渡す場合は、コンバーターのコレクションのアイテムをループしてそこに表示文字列を構築することを意味しますか? – obaylis

+1

@obaylis私は、Anvarbekのように、DataTemplateを ''のように 'DataTemplate'を使用することを指していました。これは、ListViewの各PersonをConverterに渡して、必要に応じて表示文字列を決定します。 – Rachel

1

は、あなたがするDataTemplateを使用してDataTemplate

を必要とする、あなたはあなたのリストボックスに項目としてあなたのデータを表示したい方法を選択することができます。

+0

あなたの答えをありがとう。私はこのアプローチを最初に使っていましたが、各アイテムが異なる表示文字列から本質的に同じである場合には少し残忍に思えます。 – obaylis

1

派生クラスをViewModelと見なすことができる場合は、そのクラスにプロパティを追加して、それをListView ItemTemplateに表示するだけです。または、RachelがToStringメソッドのオーバーライドを提案してから、表示バインドで単にWPFがToStringメソッドを呼び出すことを強制する"{Binding}"と書くと、

などが呼び出されます。

public class DerivedPerson : Person 
{ 
    public string DisplayString 
    { 
    get 
    { 
     return string.Format("{0} {1}",FirstName,LastName); 
    } 
    } 
} 

そして、あなたはXAML:

<ListView ItemsSource="{Binding PersonList}" SelectedItem="{Binding SelectedPerson}"> 
    <ListView.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text={Binding DisplayString}"/> 
    </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
関連する問題