2012-05-27 3 views
2

다중 선택 ListPicker (11 월 11 일부터 7.1/Mango 컨트롤 툴킷의 새 항목)를 사용하고 있습니다.ListPicker가 SummaryForSelectedItemsDelegate를 호출하지 않을 때 해제되었습니다.

내 코드는 ListPicker의 "바닐라"사용 사례입니다. 단, ListPicker에 대한 항목을 추가하고 ListPicker의 선택된 상태를 올바르게 초기화 할 수 있도록 SelecetedItems 종속성 속성을 새 List로 초기화한다는 점만 다릅니다. 나는이 작업을 수행할지 여부를이 문제가 생식 년대하지만 ...

SummaryForSelectedItemsDelegate 목록을 초기화 할 때 호출되는 않습니다 (예를 들어 나는 contactPicker.SetValue (ListPicker.SelectedItemsProperty)를 호출 할 때),하지만 난 "완료"를 클릭하지 때 단추 (비록 내 SelectionChanged 이벤트 처리기가 호출됩니다) ListPicker에.

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

답변

0

내 버그가 :-(

심지어 나는 목록으로 selectedItems를를 작성했다하지만 어디에 실제로 내 내 요약 대리자를 ... 게시 및 했어야의 각 요소 IList가 전달 된 IList는 "Item"이라고 입력되고, 전달 된 IList의 구체적인 유형은 NOT List입니다. 따라서 null 검사가 성공하고 null이 반환됩니다. 물론 내 중단 점이 해당 행 바로 뒤에 있으므로 메서드가 잘못되었습니다. 불러 오게되었습니다. Duh.

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