C# 如何使作为参数提供的对象(ViewList.SelectedItems)响应事件执行命令?

C# 如何使作为参数提供的对象(ViewList.SelectedItems)响应事件执行命令?,c#,xaml,events,parameters,mvvm-light,C#,Xaml,Events,Parameters,Mvvm Light,这似乎是如此基本,以至于我觉得我在寻找解决方案的过程中肯定遗漏了一些东西 我有一个ViewModel,它有一个ObservableCollection属性,用作关联视图中ListView的ItemsSource 我在视图中添加了EventToCommand项,该项访问RelayCommand,将命令传递给ViewModel中的methodExcelListChanged,其参数设置为ViewList中的SelectedItems属性 在my ViewModel中,您希望构建另一个包含已选择项的列

这似乎是如此基本,以至于我觉得我在寻找解决方案的过程中肯定遗漏了一些东西

我有一个ViewModel,它有一个ObservableCollection属性,用作关联视图中ListView的ItemsSource

我在视图中添加了EventToCommand项,该项访问RelayCommand,将命令传递给ViewModel中的methodExcelListChanged,其参数设置为ViewList中的SelectedItems属性

在my ViewModel中,您希望构建另一个包含已选择项的列表。在调试器中,我能够检查对象参数的内容,并验证它是否确实包含我想要访问的信息。不幸的是,我无法找到使我能够访问参数对象中的数据的键,我尝试了强制转换、赋值、更改等。强制转换和ChangeTo异常具有未知转换或类似内容。我认为,由于该对象是ListView.SelectedItems,我可能可以将其转换为某种风格,但在ListView对象之外,这似乎是不可行的

一个简单的解决方案会很好,一个复杂的解决方案会很好,一个复杂的解决方案会很痛苦

谢谢你的指导

下面是代码片段

数据结构

来自ViewModel的片段

RelayCommand所有列表已更改; 公共关系命令所有列表已更改 { 收到 { 返回所有更改的列表; } } 私有void ExcelListChangedobject参数 { var whata=parameter.GetType; 回来 } 最后是视图片段

<UserControl.Resources>
    <ViewModel:ExcelMapperViewModel x:Key="ExcelMapperViewModelDataSource" d:IsDataSource="True"/>
    <DataTemplate x:Key="ExcelFieldTemplate">
        <StackPanel>
            <TextBlock Text="{Binding FieldName, Mode=OneWay}"/>
            <TextBlock Text="{Binding Index, Mode=OneWay}"/>
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>


    <ListView x:Name="AllFields" Grid.Column="1" Grid.Row="1" Grid.RowSpan="3"
        ItemsSource="{Binding FieldNames}"
        ItemTemplate="{StaticResource ExcelFieldTemplate}"
        >
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="IsSelected" Value="{Binding IsSelected}" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Index}" Header="Index"/>
                <GridViewColumn DisplayMemberBinding="{Binding FieldName}" Header="Field Name"/>
            </GridView>
        </ListView.View>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <Custom:EventToCommand
                    Command="{Binding AllListChanged, Mode=OneWay}"
                    CommandParameter="{Binding ElementName=AllFields, Path=SelectedItems}"
                />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ListView>
我在ExcelListChanged上设置了一个断点并运行代码。当我在ListView中选择项时,ExcelListChanged被触发,我可以检查参数对象。我能够看到作为Count on参数选择的条目数,以及包含结构中字段适当信息的ExcelField项数组


那么,如何以编程方式访问调试器中可以看到的信息呢?

因为SelectedItems是IList 您可以简单地遍历它

   private void ExcelListChanged(object parameter)
{
    IList iConverted= parameter as IList;
    if(iConverted!=null){
      foreach(YouKnowTheTypeOfElements theElement in iConverted) {
         doSomethingWith(theElement);
      }
    }
    return;
}

包括您尝试过的内容以及问题发生的位置的相关代码
<UserControl.Resources>
    <ViewModel:ExcelMapperViewModel x:Key="ExcelMapperViewModelDataSource" d:IsDataSource="True"/>
    <DataTemplate x:Key="ExcelFieldTemplate">
        <StackPanel>
            <TextBlock Text="{Binding FieldName, Mode=OneWay}"/>
            <TextBlock Text="{Binding Index, Mode=OneWay}"/>
        </StackPanel>
    </DataTemplate>
</UserControl.Resources>


    <ListView x:Name="AllFields" Grid.Column="1" Grid.Row="1" Grid.RowSpan="3"
        ItemsSource="{Binding FieldNames}"
        ItemTemplate="{StaticResource ExcelFieldTemplate}"
        >
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="IsSelected" Value="{Binding IsSelected}" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
            <GridView>
                <GridViewColumn DisplayMemberBinding="{Binding Index}" Header="Index"/>
                <GridViewColumn DisplayMemberBinding="{Binding FieldName}" Header="Field Name"/>
            </GridView>
        </ListView.View>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="SelectionChanged">
                <Custom:EventToCommand
                    Command="{Binding AllListChanged, Mode=OneWay}"
                    CommandParameter="{Binding ElementName=AllFields, Path=SelectedItems}"
                />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ListView>
   private void ExcelListChanged(object parameter)
{
    IList iConverted= parameter as IList;
    if(iConverted!=null){
      foreach(YouKnowTheTypeOfElements theElement in iConverted) {
         doSomethingWith(theElement);
      }
    }
    return;
}