C#WPF迭代ListView项目

时间:2017-03-06 21:32:03

标签: c# wpf listview data-binding

我一直在努力寻找一个似乎是一个简单问题的解决方案。我试图找到一种方法来迭代我的ListView并获取值。

我有一个带有绑定的ListView,在xaml(简化)中看起来像这样:

<ListView x:Name="MColumnsListXaml" HorizontalAlignment="Left" Height="Auto" Margin="0,42,0,0" VerticalAlignment="Top" Width="Auto">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="First Name" Width="Auto" DisplayMemberBinding="{Binding MColumnName}" />
            <GridViewColumn Header="Last Name" Width="Auto" DisplayMemberBinding="{Binding MColumnName2}" />
        </GridView>
    </ListView.View>
</ListView>

我宣布绑定:

public class MandatoryColumns
{
    public string MColumnName { get; set; }
    public string MColumnName2 { get; set; }
}

列由一个调用方法的事件触发器填充:

private void btnValidateColumns_Click(object sender, RoutedEventArgs e)
{
    MandatoryOptionalColumnsList();
}
public void MandatoryOptionalColumnsList()
{
    List<MandatoryColumns> MColumnsList = new List<MandatoryColumns>();
    MColumnsList.Add(new MandatoryColumns() { MColumnName = "John", MColumnName2 = "Smith" });
    MColumnsList.Add(new MandatoryColumns() { MColumnName = "Jason", MColumnName2 = "Bell" });
    MColumnsListXaml.ItemsSource = MColumnsList;
}

现在我需要获取ListView中的信息,这就是我被困的地方。我的目的是在ListView中提取一列并与另一个列表进行交叉检查。为了得到这些值,我按照以下方式尝试了foreach循环:

public void test()
{
    foreach (var item in MColumnsListXaml.Items)
    {
        MessageBox.Show(MColumnsListXaml.ToString()); //MColumnsListXaml = {System.Windows.Controls.ListView Items.Count:2}
        MessageBox.Show(MColumnsListXaml.Items.ToString()); //MColumnsListXaml.Items = {System.Windows.Controls.ItemCollection}
        MessageBox.Show(item.ToString()); //item = {tutorialWpfApplication1.MandatoryColumns}
    }
}

在调试器中,我看到项目返回对象{tutorialWpfApplication1.MandatoryColumns}并保留我的needed information,但我找不到访问它的方法。我尝试通过使item迭代dynamic,在线声明ListViewItem而不是`var和各种解决方案,但所有内容都会导致异常错误。

3 个答案:

答案 0 :(得分:4)

试试这个:

foreach (var item in MColumnsListXaml.Items.OfType<MandatoryColumns>())
{
    MessageBox.Show(item.MColumnName);
    MessageBox.Show(item.MColumnName2);
}

答案 1 :(得分:3)

设置ItemsSource的值后,您也可以获取该值。所以你可以投射和使用像

这样的列表
List<MandatoryColumns> items = (List<MandatoryColumns>)MColumnsListXaml.ItemsSource;
foreach (MandatoryColumns item in items)
{
    //Do some work with the MandatoryColumns item
}

答案 2 :(得分:1)

如果您将item投射到MandatoryColumn类型,则应该可以访问这些值。只要您知道列表中的每个项目都属于该类型,那么在投射时不应该出现异常。