WPF ListBox 多项选择不会在模型上引发 SelectedItem

WPF ListBox multiple selection not raise SelectedItem on model

我的列表框有问题 我已将 ListBox selection 模式设置为 Multiple 问题是 Selected Item 只触发一次,当我 select 其他项目时,它不会更改视图模型中的 SelectedItem。 我确定它 selection 它们是因为我在 selected 时将 属性 绑定为 true,但 selected 项目不会更新。 例如: 可以说我有以下列表框: 一种 乙 C 选择 A -> ViewModel 将 selectedItem 更新为 A 选择 B -> ViewModel 不更新 SelectedItem 但我可以看到 B 是 selected 当我 deselect A 时,ViewModel 将 SelectedItem 更新为 null 有人已经遇到这个问题了吗? 我的主要目标是让我的 SelectedItem 更新到我选择的那个 他是我的视图代码:

<ListBox HorizontalAlignment="Center"  ItemsSource="{Binding AvailableDagrVMEs}"
                     SelectedItem="{Binding SelectedDagrVME}"
                     SelectionMode="Multiple"
                     VirtualizingStackPanel.IsVirtualizing="False"
                     ScrollViewer.HorizontalScrollBarVisibility="Auto" Padding="0" Margin="0" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.PanningMode="HorizontalOnly"
                     Background="Transparent"
                     BorderThickness="0">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <UniformGrid Rows="1"/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemContainerStyle>
                        <Style TargetType="{x:Type ListBoxItem}">
                            <Setter Property="IsSelected" Value="{Binding Taken, Mode=TwoWay}"/>
                        </Style>
                    </ListBox.ItemContainerStyle>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <DockPanel>
                                <Image Source="{Binding Icon , Converter={StaticResource BitmapToImageSourceConverter}}"/>
                            </DockPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

和视图模型:

        public BaseVME SelectedDagrVME
    {
        get { return selectedDagrVME; }
        set
        {
            if (selectedDagrVME != value)
            {
                Set("SelectedDagrVME", ref selectedDagrVME, value);
            }
        }
    }

我试过:TwoWay binding/UpdateTriggerSource

由于您有 Multiple 个选择,因此 SelectedItem 将始终是您选择的第一个。要获得最后选择的项目,您必须注册 SelectionChanged 活动并访问 SelectedItems 属性,其中包含您选择的所有项目。你可以用一个行为来实现它,因为你可以重用它。

行为:

public class ListBoxSelection : Behavior<ListBox>
{
    public static readonly DependencyProperty LastSelectedProperty = DependencyProperty.Register(nameof(LastSelected), typeof(object), typeof(ListBoxSelection), new PropertyMetadata(default(object)));

    public object LastSelected
    {
        get
        {
            return (object)GetValue(LastSelectedProperty);
        }
        set
        {
            SetValue(LastSelectedProperty, value);
        }
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
    }

    private void AssociatedObject_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
//you can also use whatever logic if you evaluate e.RemovedItems and e.AddedItems
        if ((AssociatedObject?.SelectedItems?.Count??0)>0)
        {
            LastSelected = AssociatedObject.SelectedItems[AssociatedObject.SelectedItems.Count-1];
        }
        else
        {
            LastSelected = null;
        }

    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
    }
}


XAML:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:b="clr-namespace:NameSpaceWhereBahaviorDefined"

<ListBox ...>
    <i:Interaction.Behaviors>
        <b:ListBoxSelection LastSelected = "{Binding VMSelection}" />
    </i:Interaction.Behaviors>
</ListBox>