能够从WPF/C#中的选中项获取ListView项列表?

能够从WPF/C#中的选中项获取ListView项列表?,c#,wpf,visual-studio,data-binding,C#,Wpf,Visual Studio,Data Binding,我有一个两列的列表视图。第一列是复选框,第二列是服务器值。我希望在单击一个按钮后,从本质上获得所有在该行中有相应复选框的服务器名的列表。这怎么可能?下面,我能够从我的服务器模型中成功地绑定数据,并在第一列中添加一个复选框,但我被卡住了 我试图遵循MVVM模式,因此我有一个视图模型类,理想情况下,我希望处理这个逻辑,然后在检查的服务器名称存储在某个集合中后传递它 XAML代码 我将简要描述我用于类似事情的方法 首先,对于自定义类,它应该如下所示: public class Server {

我有一个两列的列表视图。第一列是复选框,第二列是服务器值。我希望在单击一个按钮后,从本质上获得所有在该行中有相应复选框的服务器名的列表。这怎么可能?下面,我能够从我的服务器模型中成功地绑定数据,并在第一列中添加一个复选框,但我被卡住了

我试图遵循MVVM模式,因此我有一个视图模型类,理想情况下,我希望处理这个逻辑,然后在检查的服务器名称存储在某个集合中后传递它

XAML代码
我将简要描述我用于类似事情的方法

首先,对于自定义类,它应该如下所示:

public class Server
{
    public int ID { get; set; }
    public bool isChecked { get; set; }     //or IsSelected maybe? whichever name you want  
    public string NodeName { get; set; }
}
对于您的XAML,您可以使用:

<GridView>
    <GridViewColumn Width="90" Header="Select For Sync">
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <CheckBox Tag="{Binding ID}" IsChecked="{Binding isChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </GridViewColumn.CellTemplate>
    </GridViewColumn>
    <GridViewColumn Width="280" Header="Pad Name" DisplayMemberBinding="{Binding NodeName}" />
</GridView>
或者如果你想知道名字

List<string> nodeNames = Servers.Where(s => s.isChecked).Select(s => s.NodeName).ToList();
List NodeName=Servers.Where(s=>s.isChecked)。选择(s=>s.NodeName.ToList();

在您的视图中,您应该将
IsChecked
属性绑定到
服务器
类型的布尔属性,即
IEnumerable
服务器源集合中的类型
T
,而不是处理
复选框
已选中和
未选中事件

<ListView ItemsSource="{Binding Servers}" Margin="8,30,10,68">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="90" Header="Select For Sync">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox Tag="{Binding ID}" IsChecked="{Binding IsSelected}"></CheckBox>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Width="280" Header="Pad Name"  DisplayMemberBinding="{Binding NodeName}" />
        </GridView>
    </ListView.View>
</ListView>

“但我被卡住了”,到底是什么问题?第二列中没有显示任何内容吗?它只添加一行吗?如果
服务器
中的每个数据都有一个布尔值来存储复选框是否被选中,那么代码实际上可以简化,我以前做过,如果需要,可以提供一些示例代码。@KeyurPATEL我想将所选复选框转换为字符串集合,其中集合中的每个项都是服务器列中关联的字符串名称。数据显示在第二列中,但我想根据第一列中检查的内容获取数据。我以前做过类似的事情,我将尝试调整部分代码以满足您的要求作为答案。由于某种原因,此解决方案不起作用。我绑定了一个命令来打印checkedrows,函数被调用,但是列表是空的,不管我检查了什么。实际属性没有得到isCheckedYour Bounded ItemsSource的服务器对象中的更改,我可以看看实现吗(如果您使用的是
列表服务器
或其他什么?)。基本上可以尝试使用
ObservableCollection
而不是list。
List<string> nodeNames = Servers.Where(s => s.isChecked).Select(s => s.NodeName).ToList();
<ListView ItemsSource="{Binding Servers}" Margin="8,30,10,68">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="90" Header="Select For Sync">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox Tag="{Binding ID}" IsChecked="{Binding IsSelected}"></CheckBox>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Width="280" Header="Pad Name"  DisplayMemberBinding="{Binding NodeName}" />
        </GridView>
    </ListView.View>
</ListView>
var selectedItems = Servers.Where(x => x.IsSelected).ToList();
foreach(var selectedItem in selectedItems)
   ...