是否能够从WPF / C#中的已检查项目中获取ListView项目列表?

时间:2017-06-16 04:15:24

标签: c# wpf visual-studio data-binding

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

我试图遵循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>

2 个答案:

答案 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();

答案 1 :(得分:0)

您应该将Checked属性绑定到Unchecked的布尔属性,而不是处理视图中CheckBox的{​​{1}}和IsChecked事件。 }类型,即Server T源集合中的IEnumerable<T>类型:

Servers

然后,您可以简单地遍历视图模型类中<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