0

我想通过 InvokeCommandAction prism 5.0 检测列表框中的所有选定项目。

XAML

<Window x:Class="Selection.Prism5._0.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:Selection.Prism5"
    xmlns:prism="http://www.codeplex.com/prism"
    mc:Ignorable="d"
    Title="MainWindow"
    Height="350"
    Width="525">
<FrameworkElement.DataContext>
    <local:MainViewModel />
</FrameworkElement.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="5" />
        <ColumnDefinition Width="3*" />
    </Grid.ColumnDefinitions>
    <ListBox SelectedItem="{Binding SelectedItem}"
             ItemsSource="{Binding Items}"
             SelectionMode="Multiple">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <prism:InvokeCommandAction Command="{Binding SelectItemsCommand}"
                                           TriggerParameterPath="AddedItems" />
            </i:EventTrigger>
        </i:Interaction.Triggers>

        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

</Grid>

查看型号

  public class MainViewModel : BindableBase
{
    public MainViewModel()
    {
        this.Items = new List<Model>
        {
           new Model {Id=1,Name="Name 1" },
           new Model {Id=2,Name="Name 2" },
           new Model {Id=3,Name="Name 3" },
           new Model {Id=4,Name="Name 4" },
           new Model {Id=5,Name="Name 5" },
           new Model {Id=6,Name="Name 6" }
        };
        SelectItemsCommand = new DelegateCommand<object[]>((items) =>
        {
            if (items != null && items.Count() > 0)
            {
                SelectedItems = items.Select(i => (Model)i);
            }
        });

    }



    public ICommand SelectItemsCommand { get; private set; }

    private IEnumerable<Model> _items;
    public IEnumerable<Model> Items
    {
        get { return _items; }
        set
        {
            _items = value; base.OnPropertyChanged("Items");
        }
    }


    private IEnumerable<Model> _selectedItems;
    public IEnumerable<Model> SelectedItems
    {
        get { return _selectedItems; }
        set
        {
            _selectedItems = value; base.OnPropertyChanged("SelectedItems");
        }
    }
    private Model _selectedItem;
    public Model SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value; base.OnPropertyChanged("SelectedItem");
        }
    }
}

它应该工作,但它没有。当我在 GUI 中选择多个项目时:

在此处输入图像描述

查看模型代码仅识别一项:

在此处输入图像描述

我在 Brian Lagunas的“Prism 5.0 中的新功能”中看到了这个例子,据我所知,这个技术也可以用于多选。我在这里做错了什么?

4

2 回答 2

1

SelectionChangedEventArgs.AddedItems为您提供特定操作的选择列表。如果 ListBoxSelectionMode"Multiple",或者"Single"您不能一次单击选择多个项目。如果 ListBoxSelectionMode"Extended"您可以在 shift 键的帮助下选择多个项目。

SelectionChangedEventArgs.AddedItems不会为特定操作提供列表框的所有选定项。

为了您的需要,

在视图中,

更改TriggerParameterPath="AddedItems"TriggerParameterPath="Source.SelectedItems"

在视图模型中

更改DelegateCommand<object[]>DelegateCommand<System.Collections.ICollection>

参考: http: //frststart.blogspot.com/2016/10/selectionchangedselecteditemstutorial.html

于 2018-08-07T04:37:30.380 回答
0

您一次选择一个项目,每次选择一个项目时都会调用该命令。

这是预期的行为。

如果您想跟踪当前选定的项目,您可以IsSelected向类添加一个属性Model并使用 anItemContainerStyle将此属性绑定到容器的IsSelected属性:ListBoxItem

<ListBox SelectedItem="{Binding SelectedItem}"
             ItemsSource="{Binding Items}"
             SelectionMode="Multiple">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <prism:InvokeCommandAction Command="{Binding SelectItemsCommand}"
                                           TriggerParameterPath="AddedItems" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

SelectItemsCommand = new DelegateCommand<System.Collections.IList>((items) =>
{
    SelectedItems = Items.Where(x => x.IsSelected).ToList();
});
于 2017-03-01T13:33:32.227 回答