c# - 在CodeBehind中获取ListViewItem控件

标签 c# wpf xaml code-behind

我有一个 ListView ,每个项目都有一个 CheckBox 控件作为其 ItemTemplate 的一部分。

<ListView x:Name="taskListView" Grid.Row="2" BorderThickness="0" Margin="30,0,0,0" ItemsSource="{Binding ChildItems}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="25"/>
                        <ColumnDefinition Width="290"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <CheckBox Grid.Column="0" HorizontalAlignment="Center"></CheckBox>
                    <TextBlock Text="{Binding Name}" MaxWidth="270" Grid.Column="1" Margin="0,0,10,0"/>
                    <ComboBox SelectedItem="{Binding DependentTask, Mode=TwoWay}" 
                              Grid.Column="2"
                              Margin="0,3,0,3"
                              ItemsSource="{Binding DependentTasks, Converter={StaticResource addEmptyItemConverter}}" 
                              HorizontalAlignment="Left"
                              MinWidth="150"
                              DisplayMemberPath="ProjectionTaskLink.Name"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

此 ListView 的父级也有一个复选框。当选中该父复选框时,我想选中 ListViewItems 中的所有复选框。如何在代码隐藏中获取这些内容,以便根据父条件将它们设置为“已选中”或“未选中”?

谢谢。

编辑:这是完整的 XAML:

<Grid Margin="0,10,0,0">
    <Grid.RowDefinitions>
        <RowDefinition Height="25"/>
        <RowDefinition Height="20"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid Grid.Row="0">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="25"/>
            <ColumnDefinition Width="400"/>
            <ColumnDefinition Width="35"/>
            <ColumnDefinition Width="35"/>
        </Grid.ColumnDefinitions>
        <CheckBox HorizontalAlignment="Center" Grid.Column="0" Checked="CheckBox_Checked"/>
        <TextBlock Text="{Binding Name}" Grid.Column="1"/>
        <TextBlock Text="Loops " Grid.Column="2" TextAlignment="Center"/>
        <TextBox Text="{Binding Scenarios}" Grid.Column="3"/>
    </Grid>
    <TextBlock Visibility="{Binding ContainsProjectionTasks, Converter={StaticResource boolToVisibilityConverter}}" 
                   HorizontalAlignment="Left" 
                   Width="450" 
                   TextAlignment="Right" 
                   VerticalAlignment="Bottom" 
                   Grid.Row="1" 
                   Text="Task Dependencies" 
                   Background="White"/>
    <ListView x:Name="taskListView" Grid.Row="2" BorderThickness="0" Margin="30,0,0,0" ItemsSource="{Binding ChildItems}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="25"/>
                        <ColumnDefinition Width="290"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <CheckBox Grid.Column="0" HorizontalAlignment="Center"></CheckBox>
                    <TextBlock Text="{Binding Name}" MaxWidth="270" Grid.Column="1" Margin="0,0,10,0"/>
                    <ComboBox SelectedItem="{Binding DependentTask, Mode=TwoWay}" 
                              Grid.Column="2"
                              Margin="0,3,0,3"
                              ItemsSource="{Binding DependentTasks, Converter={StaticResource addEmptyItemConverter}}" 
                              HorizontalAlignment="Left"
                              MinWidth="150"
                              DisplayMemberPath="ProjectionTaskLink.Name"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

最佳答案

让 ChildItems 的元素实现 INotifyPropertyChanged。

向这些元素添加一个名为 IsChecked 的属性,这会在 setter 中引发 NotifyPropertyChangedEvent。

将 ListViewItem 的复选框绑定(bind)到 IsChecked 属性

我假设您已经在处理父复选框上的选中事件。因此,您现在需要做的就是将其添加到代码隐藏方法中:

(foreach YourType item in ChildItems)
    item.IsChecked = parentCheckbox.IsChecked;

或者您可以尝试(其中parentCheckboxName 是主复选框的x:Name。

<CheckBox IsChecked="{Binding Path=IsChecked, ElementName=parentCheckboxName}" Grid.Column="0" HorizontalAlignment="Center" />

关于c# - 在CodeBehind中获取ListViewItem控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10920430/

相关文章:

c# - 为什么 ReSharper 认为 "thread.Name == null"总是错误的?

c# - 超链接上的 EnableViewState 的作用或含义是什么?

c# - SQLITE插入数据库问题Windows Phone C#

wpf - 在 Windows 窗体中绘制 30fps 图表

xaml - Xamarin MVVM不透明度转换器?

c# - 在文本框中查看整个文件

c# - WPF 数据绑定(bind)错误 -- System.Windows.Data 错误 : 40

c# - 为什么相同的代码在 WPF 中比在 Windows 窗体中慢?

WPF DataGrid,Ctrl+C 后复制到剪贴板,OnCopyingRowClipboardContent

c# - iOS 不支持全局 PushAsync,请使用 NavigationPage