【问题标题】:Tracking items checked while looping through a ListView在循环通过 ListView 时跟踪检查的项目
【发布时间】:2014-03-27 04:07:34
【问题描述】:

我有一个这样的列表视图:

<ListView Name="FinalListView"
                  SelectionMode="Multiple"
                  SelectionChanged="FinalListView_SelectionChanged">
            <ListView.View>
                <GridView>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Tag="{Binding ID}"
                                              IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" Width="400"/>
                </GridView>
            </ListView.View>
        </ListView>

您可以看到列表视图的每个项目都包含一个复选框,但下面是我的 Parallel.Foreach 循环,用于迭代我的循环并使用项目。

请告诉我,如何不能检查哪个项目,而不是在下面的循环中检查

FinalFileNames -> 是集合。即列表视图的数据源。

Parallel.ForEach(FinalFileNames,
                    new ParallelOptions { MaxDegreeOfParallelism = 4 },
                    path =>
                    {
                        -----code ------------
                    });
            });

【问题讨论】:

    标签: wpf listview checkbox parallel.foreach


    【解决方案1】:

    在您的列表中查找选中的项目 有一个布尔属性来绑定复选框,

    foreach (TheObjectYouBindedForYourList item in FinalFileNames )
    {
      if (item.Checked== true)
      {
      }
    }
    

    【讨论】:

    • 我正在使用 Parallel.Foreach,在其中我无法获得 Checked 属性。
    【解决方案2】:

    您应该将 Checked 属性添加到 FinalFileNames 集合中的对象。我看到您已经绑定到 XAML 中的属性 ID 和 Name,所以我假设这不是原始类型的集合。因此,如果您的班级看起来像这样:

    public class FileName
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }
    

    向其添加 Checked 属性

    public bool Checked { get; set; }
    

    然后,您可以在 XAML 中添加一个样式,将 ListViewItem 的 IsSelected 属性绑定到对象的 Checked 属性。

            <ListView.Resources>
                <Style TargetType="ListViewItem">
                    <Setter Property="IsSelected" Value="{Binding Checked}"/>
                </Style>
            </ListView.Resources>
    

    现在,只要选择 ListViewItem,就会在 FileName 对象上设置 Checked 属性,并且可以在 Parallel.ForEach 代码中对其进行检查:

            Parallel.ForEach(FinalFileNames,
                    new ParallelOptions { MaxDegreeOfParallelism = 4 },
                    path =>
                    {
                        if (path.Checked)
                        {
                           // code
                        }
                    });
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2019-08-06
      • 2014-06-28
      相关资源
      最近更新 更多