2014-10-29 4 views
1

Controls.Toolkit에서 MultiselectList를 사용하고 있습니다. 내가 좋아하는 선택자로 사용합니다. 항목이있는 목록이 있고 즐겨 찾기를 선택하고 다음에 선택 바를 열면 이미 선택한 즐겨 찾기를보고 싶습니다. IsSelectionEnabledChanged 이벤트가 발생하면 IsSelectionEnabled이 참 (선택 막대가 열림)인데 목록의 SelectedItems에 즐겨 찾기를 추가하려고합니다. 여기에 코드입니다 :다중 선택 목록 업데이트 항목

private void multiSelectList_IsSelectionEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (multiSelectList.IsSelectionEnabled) 
     { 
      foreach (var favourite in FavouritesList) 
      { 
       multiSelectList.SelectedItems.Add(multiSelectList.Items.Where(i => ((MyModel)i).id == favourite.id).FirstOrDefault()); 
      } 
     } 
    } 

나는이 솔루션을 테스트하고 난 레이아웃을 선택 나는이 항목을 보이지 않아요 왜 전체 목록을 업데이트하지 않습니다 것을 알아 냈다 (그러나 그들이). 목록에있는 실제 보이는 항목조차도 아닙니다. 조금 스크롤하여 뒤로 스크롤하면 선택 항목이! 프로그래밍 방식으로 multiSelectList.UpdateLayout() 메서드를 사용하려고했지만 해결되지 않았습니다.

시각화 문제인지 또는 CheckBox 바인딩 문제인지 (선택시 측면의 CheckBox를 사용함) 궁금합니다.

답변

1

SelectedItems는 단지 List<object>이며 업데이트 할 때 이벤트를 발생시키지 않습니다. 항목을 수동으로 업데이트하려면 다음과 같이 (테스트되지 않은 코드) 대신 할 수 있습니다.

private void multiSelectList_IsSelectionEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    if(!multiSelectList.IsSelectionEnabled) 
     return; 

    var dictSelected = FavouritesList.ToDictionary(f => f.id, f => true); 

    for(int i = 0; i < multiSelectList.Items.Count; i++) 
    { 
     MyModel m = (MyModel)multiSelectList.Items[ i ]; 
     if(!dictSelected.ContainsKey(m.id)) 
      continue; // Not selected 

     MultiselectItem item = (MultiselectItem)multiSelectList.ItemContainerGenerator.ContainerFromIndex(i); 
     if(null != item) 
      item.IsSelected = true; // This should add the item into the SelectedItems collection. 
     else 
      multiSelectList.SelectedItems.Add(m); // The item is virtualized and has no visual representation yet. 
    } 
} 
+0

우수 감사합니다. – Lgn