这似乎是如此根本,我觉得在寻找解决方案时我必须遗漏一些东西。
我有 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项的数组,以及结构中字段的相应信息。
那么如何以编程方式访问我在调试器中看到的信息?
答案 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;
}