2

我正在使用多选 ListPicker(2011 年 11 月 7.1/Mango 控制工具包中的新选项)。

我的代码在下面 - ListPicker 的“普通”用例,除了我使用新 List 初始化 SelectedItems 依赖项属性,因此我可以向其中添加内容并正确初始化 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 的具体类型不是列表。因此空值检查成功并且该方法返回空值。当然,我的断点就在该行之后,所以看起来该方法没有被调用。呃。

    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 回答