我正在使用多选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);
}
});
答案 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();
}