如何将对象(ViewList.SelectedItems)作为参数提供给Command以响应事件?

时间:2014-09-09 17:37:56

标签: c# xaml events parameters mvvm-light

这似乎是如此根本,我觉得在寻找解决方案时我必须遗漏一些东西。

我有 ViewModel ,其 ObservableCollection < ExcelField>属性,用作相关视图 ListView ItemsSource

我在查看中添加了 EventToCommand 项,该项访问 RelayCommand 以将命令传递给 ViewModel 中的方法(ExcelListChanged),其参数设置为 ViewList 中的 SelectedItems 属性。

在我的 ViewModel 中,我想构建另一个列表,其中包含已选择的项目。在调试器中,我能够检查对象参数的内容,并验证它确实包含我想要访问的信息。遗憾的是,我无法找到使我能够访问参数对象中的数据的密钥,我尝试过转换,分配,ChangeTo等等。具有未知转换或类似内容的强制转换和ChangeTo异常。我认为,因为该对象是一个 ListView.SelectedItems (?),我可以将它转换为某种风格,但看起来它在ListView对象之外是不可行的。

一个简单的解决方案将是伟大的,一个复杂的解决方案将是好的,一个令人费解的一个很痛苦。

感谢任何指导。

以下是代码

数据结构

public struct ExcelField
{
    private int index;
    public int Index
    {
        get { return index; }
        private set { index = value; }
    }
    private string fieldName;
    public string FieldName
    {
        get { return fieldName; }
        private set { fieldName = value;  }
    }

    public ExcelField(int ndx, string name)
    {
        index = ndx;
        fieldName = name;
    }
}

来自ViewModel的碎片

    ObservableCollection<ExcelField> fieldNames;
    public ObservableCollection<ExcelField> FieldNames
    {
        get
        {
            return fieldNames;
        }
        set
        {
            fieldNames = value;
            OnPropertyChanged("FieldNames");
        }
    }
       allListChanged = new RelayCommand(args => ExcelListChanged(args));
    RelayCommand allListChanged;
    public RelayCommand AllListChanged
    {
        get
        {
            return allListChanged;
        }
    }
    private void ExcelListChanged(object parameter)
    {
        var whata = parameter.GetType();
        return;
    }

最后是View件

<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被触发,我可以检查参数 object 。我能够看到选择作为Count on参数的条目数和ExcelField项的数组,以及结构中字段的相应信息。

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

1 个答案:

答案 0 :(得分:0)

因为SelectedItems是IList http://msdn.microsoft.com/en-us/library/system.collections.ilist(v=vs.110).aspx 你可以简单地遍历它...

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