Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf prism 5.0 InvokeCommandAction SelectionMode=";“多重”;_Wpf_Mvvm_Prism_Prism 5 - Fatal编程技术网

Wpf prism 5.0 InvokeCommandAction SelectionMode=";“多重”;

Wpf prism 5.0 InvokeCommandAction SelectionMode=";“多重”;,wpf,mvvm,prism,prism-5,Wpf,Mvvm,Prism,Prism 5,我想通过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

我想通过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");
        }
    }
}

查看模型

<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");
        }
    }
}
公共类MainViewModel:BindableBase { 公共主视图模型() { this.Items=新列表 { 新模型{Id=1,Name=“Name 1”}, 新模型{Id=2,Name=“Name 2”}, 新模型{Id=3,Name=“Name 3”}, 新模型{Id=4,Name=“Name 4”}, 新模型{Id=5,Name=“Name 5”}, 新模型{Id=6,Name=“Name 6”} }; SelectItemsCommand=newdelegateCommand((项)=> { if(items!=null&&items.Count()>0) { SelectedItems=items.Select(i=>(Model)i); } }); } public ICommand selectItems命令{get;private set;} 私人IEnumerable_项目; 公共数字项目 { 获取{return\u items;} 设置 { _items=值;base.OnPropertyChanged(“items”); } } 私有IEnumerable _selectedItems; 公共IEnumerable SelectedItems { 获取{return\u selectedItems;} 设置 { _selectedItems=value;base.OnPropertyChanged(“selectedItems”); } } 私有模型_selectedItem; 公共模型SelectedItem { 获取{return\u selectedItem;} 设置 { _selectedItem=value;base.OnPropertyChanged(“selectedItem”); } } } 它应该能工作,但它不能。在GUI中选择多个项目时:

视图模型代码仅识别一个项目:

我在Brian Lagunas的文章中看到了这个例子,据我所知,这种技术也可以用于多选。
我做错了什么?

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

这是预期的行为

如果要跟踪当前选定的项目,可以将
IsSelected
属性添加到
Model
类中,并使用
ItemContainerStyle
将此属性绑定到
ListBoxItem
容器的
IsSelected
属性:

<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=newdelegateCommand((项)=>
{
SelectedItems=Items.Where(x=>x.IsSelected.ToList();
});
SelectionChangedEventArgs.AddedItems提供特定操作的选择列表。如果ListBox
SelectionMode
“多个”
“单个”
,则不能一次单击选择多个项目。如果列表框
SelectionMode
“扩展的”
,您可以借助shift键选择多个项目

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

为了你的需要

鉴于,

TriggerParameterPath=“AddedItems”
更改为
TriggerParameterPath=“Source.SelectedItems”

在视图模型中

DelegateCommand
更改为
DelegateCommand

参考:

您一次选择一个项目,并为每个项目调用该命令。这是预期的行为。谢谢你的想法。这可能奏效,但是我认为这个解决方案太棘手了:1)。使用棱镜2)。甚至触发3)。命令绑定,而只需一个行为和几行代码就可以解决它。这是否意味着使用prism进行多选时没有简单的解决方案?棘手?不,这就是MVVM模式的工作方式。如果您认为这是一个“棘手”的解决方案,您应该学习MVVM。Prism只是将EventArgs的AddedItems属性的实际值传递给命令,这将只包含我在回答中解释的新选择的项。Prism与此无关。KIS。我不喜欢写多余的代码。我不需要使用所有这些技巧来实现多重选择,因为通过使用自定义行为和绑定到SelectedItems,可以非常简单地实现多重选择。更简单,xaml和代码隐藏中的代码更少。我以前做过,但我认为棱镜可以做得更简单。我错了。有点决心:)我仍然会使用行为。我只是尝试使用prism5.0的功能。根据我上面提到的视频课程,可以通过prism实现多重选择,我不需要为多重选择编写行为。谢谢。如前所述,您应该跟踪视图模型中的选定项,但InvokeCommandAction将只将最新选定项传递给命令。我想这回答了你原来的问题。如果你有其他问题,你应该问一个新问题。