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