我有一个listview,每个Item都有一个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中的所有复选框。我如何获得Codebehind中的那些,以便我可以根据父条件将它们设置为Checked或Unchecked?
感谢。
编辑:这是完整的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>
答案 0 :(得分:1)
让ChildItems的元素实现INotifyPropertyChanged。
向名为IsChecked的元素添加属性,这会在setter中引发NotifyPropertyChangedEvent。
将ListViewItem的复选框绑定到IsChecked属性
我假设您已经在父复选框上处理已检查的事件。所以你现在需要做的就是将它添加到codebehind方法中:
(foreach YourType item in ChildItems)
item.IsChecked = parentCheckbox.IsChecked;
或者您可以尝试(其中parentCheckboxName是x:主复选框的名称。
<CheckBox IsChecked="{Binding Path=IsChecked, ElementName=parentCheckboxName}" Grid.Column="0" HorizontalAlignment="Center" />
答案 1 :(得分:1)
在listview itemssource中为listview中的复选框创建一个属性,并将其绑定到属性。
然后,您可以在父复选框的Checked和UnChecked事件中编写此代码:
foreach(var item in myItemsSource)
item.IsChecked=ParentCheckBox.IsChecked.GetValueOrDefault();
祝你好运。
答案 2 :(得分:0)
将这两个复选框绑定在标记中:
<CheckBox IsChecked="{Binding Path=IsChecked, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type YourAncestorType}}}" Grid.Column="0" HorizontalAlignment="Center" />
这里不需要使用代码隐藏。
答案 3 :(得分:0)
我最终只是在我的ViewModel中更改了父复选框的IsChecked属性的setter中的ListView ItemsSource集合。这消除了对代码隐藏的任何需求。与NotifyPropertyChanged结合使用,现在可以使用了。