2012-05-27 1 views
2

Я использую многоэкранный ListPicker (новый в 7.1/Mango control toolkit от Nov '11).ListPicker не вызывает SummaryForSelectedItemsDelegate при увольнении

Мой код ниже - «ванильный» вариант использования для ListPicker, за исключением того, что я инициализирую свойство зависимостей SelecetedItems новым списком, чтобы я мог добавить к нему что-то и правильно инициализировать выбранное состояние для ListPicker. Хотя этот вопрос воспроизводит, действительно ли это ...

Вывод SummaryForSelectedItemsDelegate вызывает при инициализации списка (например, когда я вызываю contactPicker.SetValue (ListPicker.SelectedItemsProperty)), но НЕ, когда я нажимаю кнопку «done», в ListPicker (хотя мой обработчик события SelectionChanged вызывает вызов).

Как только я отклоняю ListPicker, я получаю только строку, соответствующую первому выделенному элементу в «summary» для элемента управления (в отличие от элемента управления, вызывающего моего делегата, и получения списка выделенных элементов с разделителями-запятыми).

Это ошибка? Кто-нибудь еще сталкивается с этим? Есть ли обходной путь?

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

я отправил мой мой сводный делегат ... который на самом деле, где моя ошибка была :-(

Хотя я создавал SelectedItems в виде списка, и каждый из элементов в Прошедшие IList набраны «Item», конкретный тип IList, который прошел, - это NOT List, поэтому проверка нулевой последовательности завершается успешно, и метод возвращает null. И, конечно, моя точка останова была сразу после этой строки, поэтому она выглядела так, как будто метод wasn ' т.

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