ListPicker在被解雇时不调用SummaryForSelectedItemsDelegate

时间:2012-05-27 22:51:55

标签: c# windows-phone-7 windows-phone-7.1 listpicker

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

我的代码如下 - ListPicker的“vanilla”用例,不同之处在于我使用新的List初始化SelecetedItems依赖项属性,因此我可以向其添加内容并正确初始化ListPicker的选定状态。虽然这个问题重申了我是否这样做......

在初始化列表时会调用SummaryForSelectedItemsDelegate(例如,当我调用contactPicker.SetValue(ListPicker.SelectedItemsProperty)时),但是当我单击ListPicker上的“done”按钮时(尽管我的SelectionChanged事件处理程序被调用)

一旦我解除ListPicker,我只得到对应于控件“摘要”中第一个选定项目的字符串(而不是控件调用我的委托并获得逗号分隔的所选项目列表)。 / p>

这是一个错误吗?有没有其他人遇到这个?有解决方法吗?

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);
    }
});

1 个答案:

答案 0 :(得分:0)

我应该发布我的摘要委托......这实际上是我的错误所在:-(

即使我将SelectedItems创建为List,并且传入的IList中的每个元素都是“Item”类型,但传入的IList的具体类型是NOT List。因此,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();
    }