2017-06-16 74 views
-1

我有两列的列表视图。第一列是复选框,第二列是服务器值。我想从本质上得到一个列表,在点击一个按钮后,在该行有相应的复选框。这怎么可能?在下面,我能够从我的服务器模型中成功绑定数据,并在第一列中放入了一个复选框,但我被卡住了。能够从WPF/C#中的选中项目中获取ListView项目的列表?

我试图按照MVVM模式,所以我有一个视图模型类,我最好想处理这个逻辑,然后在检查服务器名称存储在某个集合后传递它。

XAML代码

<ListView ItemsSource="{Binding Servers}" Margin="8,30,10,68"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Width="90" Header="Select For Sync"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <CheckBox Tag="{Binding ID}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Width="280" Header="Pad Name" 
          DisplayMemberBinding="{Binding NodeName}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 
+0

“但我坚持”,是什么问题到底是什么?第二栏中没有显示任何内容吗?它只添加一行吗?如果'Servers'中的每个数据都有一个布尔值,用于存储是否选中该复选框,我之前完成了此操作,并且可以根据需要提供一些示例代码,那么您的代码实际上可以被简化。 –

+0

@KeyurPATEL我想将选中的复选框转换为字符串集合,其中集合中的每个项目都是服务器列中的关联字符串名称。数据显示在第二列中,但我想根据第一列中检查的内容获取这些数据。 – ryan

+0

我之前做过一些非常类似的事情,我会尝试根据您的要求调整部分代码作为答案。 –

回答

0

我将简要介绍我用类似的方法。

首先,自定义类,它应该是这个样子:

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> 

您的收藏/列表您可以使用它从上面绑定到ListView(Servers)的数据类型应该是Server

List<Server> checkedRows = Servers.Where(s => s.isChecked).ToList(); //there, you now have a list of checked rows 

或者如果你想名字

List<string> nodeNames = Servers.Where(s => s.isChecked).Select(s => s.NodeName).ToList(); 
+0

由于某种原因,此解决方案无法正常工作。我绑定了一个命令来打印checkedrows,函数被调用,但列表是空的,无论我检查什么。 – ryan

+0

实际的属性没有得到isChecked – ryan

+0

服务器对象的更改您的绑定ItemsSource,我可以看到实现(如果您使用'List Servers'或其他?)。基本上可以尝试使用'ObservableCollection '[ObservableCollection Class](https://msdn.microsoft。com/en-us/library/ms668604(v = vs.110).aspx)而不是列表。 –

0

而不是处理的的CheckedUnchecked事件:每当你需要访问检查框和相应的行,它就是这么简单CheckBox在您看来,您应该将IsChecked属性绑定到您的Server类型的布尔属性,即您的IEnumerable<T>Servers源类型中的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> 

然后你可以在Servers集合中的视图模型类中通过记录简单地迭代,并检查属性,以确定当前选择哪些项目:

var selectedItems = Servers.Where(x => x.IsSelected).ToList(); 
foreach(var selectedItem in selectedItems) 
    ...