リストボックスがコンテンツのレンダリング方法を認識していることを確認するには、DataTemplate
でを使用する必要があります。ListBox
上記のようなクラスベースのアプローチに従うと仮定します。
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding value}">
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
これにより、DataTemplate
追加したアイテムごとに、追加さListBox
れたアイテムのプロパティにバインドされたテキストブロックを含むが作成されます。
バインディングについて読む-これは、WPF / WP7 / Silverlightで最も強力なものの1つであり、おそらくそこにあるバインディングの最も広範な実装の1つです。
http://www.mono-software.com/blog/post/Mono/166/Data-binding-in-Windows-Phone-7-application/
編集:
ListBoxのデフォルトのテンプレートは、各アイテムで「ToString()」を呼び出すだけだと確信していますが、とにかく機能するはずです。
ああ、メンバーをフィールドではなく自動プロパティにすることを検討してください。
public string ID { get; set; }
編集:
わかりました。Linqは得意ではありませんが、クエリはIEnumerable<KeyValuePair<string, string>>
私が見る限り返されるはずなので、それを列挙してオブジェクトを構築することができます。
var myList = new ObservableCollection<MyClass>();
foreach(var kvp in dict)
{
myList.Add(new MyClass(kvp.Key, kvp.Value));
// Or myList.Add(new MyClass() { ID = kvp.Key, Value = kvp.Value }); depending on your constructor
}
そうは言っても、辞書項目のキー/値を指すことができない理由はありません(KeyValuePair<string, string>
他のものと同じように単なる参照型です)
これ:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Key}">
<TextBlock Text="{Binding Value}">
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
あなたに与えるべき
{Key}
{Value}
{Key}
{Value}
{Key}
{Value}
リストボックス内
結果アイテムから追加の機能が必要ないと仮定すると、KeyValuePair
十分なはずです。いくつかの値を表示するためだけにクラスを作成することは、すでに99%の道のりを進んでいるため、やり過ぎかもしれません。
いくつかのMVVMパターンを調べて、MVVMフレームワークを調べたいと思うかもしれません(私はいつもそれを使用しているので偏見がありますが、Caliburn.Microは本当に使い始めやすく、WP7をサポートしています)。
あなたのコードはこれ以上複雑ではありませんが、特定のものがあなたのために配線され、バインディングなどでどこが間違っているかについてより多くのフィードバックを提供します(特にポップアップ/コンテキストメニューが関与)
XAMLベースのテクノロジーの開発に真剣に取り組んでいる場合、それらはMVVMパターンと密接に関連しており、フレームワークは物事を簡単にします。
興味がある場合は、ここで簡単にフォローできます。
https://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation
もう少し情報が入った同じツタンカーメンの別のバリエーションはここにあります:
http://buksbaum.us/2010/08/01/caliburn-micro-hello-world/