在 WPF ListBox 中选择多个项目只会选择第一个选定的项目

Selecting mutliple items in a WPF ListBox only selects the first selected item

从下拉列表中 selecting 一个角色后,我有一个带有 "roles" 的 ComboBox,在列表框下方 selects selected 角色具有的权限.但问题来了,它只是 select 第一个 selected 项目。

在不修改设计/模板的情况下一切都很好,但没有它看起来就不好看!

代码情况:

<ComboBox Name="AccessRoleBx" MinWidth="190" Height="35" SelectionChanged="AccessRoleBx_OnSelected" HorizontalContentAlignment="Center"
                                      VerticalContentAlignment="Center" />

<ListBox MaxHeight="225" Height="Auto" Width="335" Name="AccessPermissionBx" SelectionMode="Multiple" IsSynchronizedWithCurrentItem="True">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <CheckBox Margin="5,2"
                                                      IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem, AncestorLevel=1}, Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"
                                                      Unchecked="ToggleButton_OnUnchecked"
                                                      Checked="ToggleButton_OnChecked">
                                                <TextBlock Text="{Binding}" />
                                            </CheckBox>
                                        </StackPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
        private void AccessRoleBx_OnSelected(object sender, RoutedEventArgs e)
        {
            if (AccessRoleBx.SelectedItem is AccessRole accessRole)
            {
                accessRole.Load(_app);
                AccessPermissionBx.UnselectAll();
                foreach (var ap in accessRole.Permissions)
                {
                    AccessPermissionBx.SelectedItems.Add(ap);
                }

                AccessPermissionBx.Items.Refresh();
                SelectedRoleBx.Text = $"({accessRole.Name})";
            }
        }

        private void ToggleButton_OnChecked(object sender, RoutedEventArgs e)
        {
            if (sender is CheckBox cb)
            {
                if (cb.Content is ContentPresenter cp)
                {
                    if (cp.Content is ActionPermission ap)
                    {
                        if (!AccessPermissionBx.SelectedItems.Contains(ap))
                        {
                            AccessPermissionBx.SelectedItems.Add(ap);
                        }

                        AccessPermissionBx.Items.Refresh();
                    }
                }
            }
        }

        private void ToggleButton_OnUnchecked(object sender, RoutedEventArgs e)
        {
            if (sender is CheckBox cb)
            {
                if (cb.Content is ContentPresenter cp)
                {
                    if (cp.Content is ActionPermission ap)
                    {
                        if (AccessPermissionBx.SelectedItems.Contains(ap))
                        {
                            AccessPermissionBx.SelectedItems.Remove(ap);
                        }

                        AccessPermissionBx.Items.Refresh();
                    }
                }
            }
        }

        private void OnLoad(object sender, RoutedEventArgs e)
        {
            var bw = new BackgroundWorker();

            bw.DoWork += (o, args) =>
            {
                Dispatcher.Invoke(() =>
                {
                    AccessRoleBx.ItemsSource = _requests.GetAccessRoles();
                    AccessPermissionBx.ItemsSource = Enum.GetValues(typeof(ActionPermission));

                    AccessRoleBx.SelectedIndex = 0;

                    AccessPermissionBx.Items.Refresh();
                });
            };
            //bw.RunWorkerCompleted += (o, args) => { };
            bw.RunWorkerAsync();

            AccessRoleCreateBtn.IsEnabled = false;

            AccessRoleBx.DisplayMemberPath = "Name";
            AccessRoleBx.Items.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
        }

所以我的主要问题是为什么它只 select 第一个 selected 项目,我该如何解决?

感谢 @Andy 提供解决方案。

问题是 ListBox 选项 IsSynchronizedWithCurrentItem="True" 导致 ListBox 将自身限制为 "Single Selection Mode" 但是 SelectionMode 本身并未反映出来。

更改列表框自:

<ListBox IsSynchronizedWithCurrentItem="True" SelectionMode="Multiple" />

通过删除 IsSynchronizedWithCurrentItem 选项来做到这一点:

<ListBox SelectionMode="Multiple" />

应该可以解决这个问题!