0

次のようなデータを含む辞書があります。

key     Value
UK01    Building 1
UK02    Building 2

次のようにデータが入力されるテキストボックスがあります。

foreach (var building in dictionary)
{
    listbox1.Items.Add(building.Value);
}

これは次に表示されますBuilding 1 Building 2, ...

問題:

私がやりたいことは、SelectionChangedがトリガーされたときに、選択されたオプションのキー/値にアクセスし、後で使用できる変数としてこれらを保存できるようにすることです。現在、選択された項目、つまり「建物 1」のみを取得できます。または取得できますがSelectedInded、これは 1、2、.. しか得られません。理由は理解できます。

したがって、キーを表示せずにキー/値にアクセスできるようにすることは (エレガントに) 可能ですか? クラスを使用しようとしました:

 public class Test
 {
    public ID { get; set; }
    public value { get; set; }

 }

しかし、これはうまくいきませんでした。誰か提案はありますか?

ありがとうございました :)

4

3 に答える 3

3

リストボックスがコンテンツのレンダリング方法を認識していることを確認するには、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/

于 2013-01-28T15:07:26.730 に答える
1

ToStringクラスの関数をオーバーライドするだけでよいと思いますTest。希望どおりに機能するはずです

このような:

public override string ToString()
{
   return Value;
}
于 2013-01-28T13:20:23.920 に答える
0

私はWPFを知っていますが、多少似ているはずです。そこで、データ バインディングと呼ばれるものを使用して、コントロールをコレクションにバインドできます。

http://msdn.microsoft.com/en-us/magazine/cc163299.aspx

http://blogs.msdn.com/b/wriju/archive/2011/07/25/windows-phone-7-binding-data-to-listbox-through-code.aspx

于 2013-01-28T13:20:17.670 に答える