【问题标题】:C# WPF Iterate through ListView itemsC# WPF 遍历 ListView 项目
【发布时间】:2017-03-06 21:32:03
【问题描述】:

我一直在为看似简单的问题寻找解决方案而发疯。我正在尝试找到一种方法来遍历我的 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 来迭代dynamic,而不是`var 和各种在线解决方案声明ListViewItem,但一切总是导致异常错误。

【问题讨论】:

    标签: c# wpf listview data-binding


    【解决方案1】:

    试试这个:

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

    【讨论】:

      【解决方案2】:

      设置ItemsSource 的值后,您也可以获取该值。所以你可以像

      一样投射和使用列表
      List<MandatoryColumns> items = (List<MandatoryColumns>)MColumnsListXaml.ItemsSource;
      foreach (MandatoryColumns item in items)
      {
          //Do some work with the MandatoryColumns item
      }
      

      【讨论】:

      • 感谢您的快速回答,但结果完全相同。项目返回{tutorialWpfApplication1.MandatoryColumns},就像我在帖子的屏幕截图中看到的一样。我可以在调试器的item 对象中看到此信息,但不知道如何访问它。
      • 我回答得太早了。我现在实际上可以访问该值。我不敢相信它是如此简单!
      • 如果他回答了你的问题,别忘了给他“正确答案”一票。
      【解决方案3】:

      如果您将item 转换为MandatoryColumn 类型,您应该能够访问这些值。只要您知道列表中的每个项目都属于该类型,那么您在转换时就不应该遇到异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        相关资源
        最近更新 更多