2

WinRT アプリ (C#) にはList<Item> items、 にバインドする がありListBoxます。
Class Itemと の 2 つのフィールドがstring Nameありbool IsSelectedます。すでにお分かりのように、IsSelectedフィールドを ListBoxItem の IsSelected プロパティにバインドします。

なぜこれが必要なのですか?SelectedItemsのプロパティを使用しなかったのはなぜListBoxですか?

  1. ロードされたばかりのときListBox、私はすでにいくつかのアイテムを持っています。IsSelected = true
  2. 選択したすべてのアイテムを保存するために別のコレクションを作成したくありません。

私が探しているものは何ですか?
WPFのように、エレガントなソリューションを探しています:

 <ListBox.ItemContainerStyle>
  <Style TargetType="ListBoxItem">
    <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
  </Style>
 </ListBox.ItemContainerStyle>

しかし、WinRT がセッターでのバインドをまったくサポートしていないことは誰もが知っています。

Filip Skakunブログの素敵な投稿もチェックしています。これは解決策の 1 つですが、自分でいくつか書く必要があります。BindingBuilder/BindingHelper

そして今、私は私の問題を解決する2つの方法を知っています:

  1. アイテムの別のコレクションのSelectedItemsプロパティをバインドして保存します。ListBox-私はこの方法が好きではありません
  2. Filip Skakunのように実行します。何も見つからない場合は、これを使用します。

理想的な状況では、これにネイティブソリューションを使用したい、または誰かがBindingBuilder私の状況に合わせてネストされたものを既に作成/テストしている可能性があります-それも役に立ちます。

4

1 に答える 1

2

派生 ListBox を作成するのはどうですか:

public class MyListBox : ListBox
{
    protected override void PrepareContainerForItemOverride(
        DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);

        if (item is Item)
        {
            var binding = new Binding
            {
                Source = item,
                Path = new PropertyPath("IsSelected"),
                Mode = BindingMode.TwoWay
            };

            ((ListBoxItem)element).SetBinding(ListBoxItem.IsSelectedProperty, binding);
        }
    }
}
于 2013-06-19T17:55:14.887 に答える