2

複数選択 ListPicker (11 年 11 月の 7.1/Mango コントロール ツールキットの新しいもの) を使用しています。

私のコードは以下のとおりです - ListPicker の「普通の」使用例ですが、SelecetedItems 依存関係プロパティを新しい List で初期化して、ListPicker の選択状態を適切に初期化できるようにします。この問題の再現は、私がこれを行うかどうかですが...

SummaryForSelectedItemsDelegate は、リストを初期化するときに呼び出されます (たとえば、contactPicker.SetValue(ListPicker.SelectedItemsProperty) を呼び出すとき) が、ListPicker の [完了] ボタンをクリックしたときではありません (SelectionChanged イベント ハンドラーは呼び出されます)。

ListPicker を閉じると、コントロールの "概要" で最初に選択された項目に対応する文字列のみが取得されます (コントロールがデリゲートを呼び出して、選択された項目のコンマ区切りのリストを取得するのとは対照的です)。

これはバグですか?他の誰かがこれに遭遇しましたか?回避策はありますか?

var contactPicker = new ListPicker()
{
    MinWidth = minWidth,
    ExpansionMode = ExpansionMode.FullScreenOnly,
    SelectionMode = SelectionMode.Multiple,
    SummaryForSelectedItemsDelegate = (list) => { return CreateCommaDelimitedList(list); },
    IsTabStop = true
};

contactPicker.ItemsSource = listOfItems;
contactPicker.DisplayMemberPath = "Name";
contactPicker.SetValue(ListPicker.SelectedItemsProperty, new List<Item>());

// initialize the list picker selected values
foreach (var contactRef in listOfSelectedContacts)
    contactPicker.SelectedItems.Add(contactRef);

contactPicker.SelectionChanged += new SelectionChangedEventHandler((o, ea) => 
{
    // add all the newly added items
    foreach (var added in ea.AddedItems)
    {
        Item addedItem = added as Item;
        if (addedItem == null)
            continue;
        listOfSelectedContacts.Items.Add(addedItem);
    }

    // remove all the newly removed items
    foreach (var removed in ea.RemovedItems)
    {
        Item removedItem = removed as Item;
        if (removedItem == null)
            continue;
        listOfSelectedContacts.Items.Remove(removedItem);
    }
});
4

1 に答える 1

0

要約デリゲートを投稿する必要がありました...実際にバグがあった場所です:-(

SelectedItems をリストとして作成し、渡された IList の各要素は「Item」と入力されていましたが、渡された IList の具体的なタイプはリストではありません。したがって、null チェックは成功し、メソッドは null を返します。もちろん、ブレークポイントはその行の直後にあったため、メソッドが呼び出されていないように見えました。当たり前。

    private string CreateCommaDelimitedList(IList ilist)
    {
        IList<Item> list = ilist as IList<Item>;
        if (list == null)
            return null;

        // build a comma-delimited list of names to display in a control
        List<string> names = list.Select(it => it.Name).ToList();
        StringBuilder sb = new StringBuilder();
        bool comma = false;
        foreach (var name in names)
        {
            if (comma)
                sb.Append(", ");
            else
                comma = true;
            sb.Append(name);
        }
        return sb.ToString();
    }
于 2012-05-27T23:06:17.810 に答える