2014-10-29 74 views
1

我正在使用Controls.Toolkit的MultiselectList。我用它作为最喜欢的选择器。我有一个包含项目的列表,我选择了收藏夹,下次打开选择栏时,我希望看到我的收藏夹已被选中。当IsSelectionEnabledChanged事件发生时,如果IsSelectionEnabled为真(选择栏已打开),我尝试将我的收藏夹添加到列表的SelectedItems。下面的代码片段:更新MultiselectList选择的项目

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 2014-11-03 22:27:08