更新MultiselectList选定的项目

时间:2014-10-29 15:40:09

标签: windows-phone-7 windows-phone

我正在使用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 个答案:

答案 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.
    }
}