我正在使用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)。
答案 0 :(得分: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.
}
}