WPF ListBox множественный выбор не поднимает SelectedItem на модели - PullRequest
0 голосов
/ 03 июля 2018

У меня проблема с моим ListBox Я установил режим выбора ListBox на несколько Проблема в том, что выбранный элемент срабатывает только один раз, и когда я выбираю другие элементы, он не меняет SelectedItem в модели представления. Я уверен, что его выбор их, потому что я привязываю свойство к true, когда они выбраны, но выбранный элемент не обновляется. Например: Допустим, у меня есть ListBox со следующим: В С Выберите A -> ViewModel обновить выбранный элемент до A Выберите B -> ViewModel не обновляет SelectedItem, но я вижу, что B выбран Когда я отменяю выбор A, ViewModel обновляет SelectedItem до нуля Кто-то уже сталкивался с этой проблемой? Моя главная цель - сохранить обновление 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>

И ViewModel:

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

Я пробовал: двухстороннее связывание / UpdateTriggerSource

1 Ответ

0 голосов
/ 03 июля 2018

Поскольку у вас есть выбор 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: я = "CLR-имена: System.Windows.Interactivity; сборка = System.Windows.Interactivity" XMLNS: б = "CLR-имена: NameSpaceWhereBahaviorDefined"

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