在 CodeBehind 中获取 ListViewItem 控件
本文关键字:ListViewItem 控件 获取 CodeBehind | 更新日期: 2023-09-27 18:36:22
我有一个列表视图,每个项目都有一个复选框控件作为其 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>
此列表视图的父级也有一个复选框。选中该父复选框后,我想选中列表视图项中的所有复选框。如何在代码隐藏中获取这些内容,以便根据父条件将它们设置为"选中"或"未选中"?
谢谢。
编辑:这是完整的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。
向这些元素添加一个名为 IsCheck 的属性,这会在资源库中引发 NotifyPropertyChangedEvent。
将列表视图项的复选框绑定到 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" />
在列表视图项源中,在列表视图中创建一个属性 for 复选框,并将其绑定到该属性。
然后,您可以在父复选框的"选中"和"未选中"事件中编写此代码:
foreach(var item in myItemsSource)
item.IsChecked=ParentCheckBox.IsChecked.GetValueOrDefault();
祝你好运。
在标记中绑定这两个复选框:
<CheckBox IsChecked="{Binding Path=IsChecked, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type YourAncestorType}}}" Grid.Column="0" HorizontalAlignment="Center" />
这里不需要使用代码隐藏。
我最终只是在我的视图模型中更改了父复选框的 IsChecked 属性的 setter 中的 ListView ItemsSource 集合。这消除了对代码隐藏的任何需求。再加上 NotifyPropertyChanged,它现在可以工作了。