Checkbox in wpf listview header not checking all items
我的WPF应用程序中有一个listview,第一列是一个Checkbox。 此复选框绑定到我模型的IsSelected属性,并且事件传播正确发生。
我在同一列的标题中也有一个Checkbox,并且想要实现一个" Select All"功能,在其中它检查所有listview项。
我可以附加到流程中,并看到数据正在更改,并且以编程方式更改了模型中的数据,但是它没有反映在UI中。 我也实现了INotifyPropertyChanged。
有人可以在这里解释我在做什么错..
相关代码部分在下面提到。
Xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <ListView Height="470" ItemsSource="{Binding Path=Songs,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" x:Name="yourSongListView" GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler" ItemContainerStyle="{StaticResource itemStyle}" AlternationCount="2"> <ListView.View> <GridView ColumnHeaderContainerStyle="{StaticResource CustomHeaderStyle}"> <GridView.Columns> <GridViewColumn HeaderTemplate="{StaticResource checkboxHeaderTemplate}" CellTemplate="{StaticResource CheckBoxCell}" Width="30"> </GridViewColumn> <GridViewColumn CellTemplate="{StaticResource TitleTemplate}" Width="450"> <GridViewColumnHeader Content="TITLE" Tag="Title" /> </GridViewColumn> </GridView.Columns> </GridView> </ListView.View> </ListView> <DataTemplate x:Key="checkboxHeaderTemplate"> <CheckBox Checked="CheckBox_Checked"> <CheckBox.Template> <ControlTemplate TargetType="CheckBox"> <Image Name="TickImage" Source="Images\\track-list-select.png" Width="18" Height="18" /> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter TargetName="TickImage" Property="Source" Value="Images\\track-list-select-active.png" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </CheckBox.Template> </CheckBox> </DataTemplate> <DataTemplate x:Key="CheckBoxCell"> <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay}"> <CheckBox.Template> <ControlTemplate TargetType="CheckBox"> <Image Name="TickImage" Source="Images\\track-list-select.png" Width="18" Height="18" /> <ControlTemplate.Triggers> <Trigger Property="IsChecked" Value="True"> <Setter TargetName="TickImage" Property="Source" Value="Images\\track-list-select-active.png" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </CheckBox.Template> </CheckBox> </DataTemplate> |
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | private void CheckBox_Checked(object sender, RoutedEventArgs e) { CheckBox c = sender as CheckBox; if (c.IsChecked.HasValue) { Model.ToggleAllSelection(c.IsChecked.Value); } else { Model.ToggleAllSelection(false); } } public void ToggleAllSelection(bool newState) { foreach (var item in Songs) { item.IsSelected = newState; InvokePropertyChanged("IsSelected"); } InvokePropertyChanged("Songs"); } |
歌曲是ObservableCollection
如果您希望触发对某个属性进行更改的属性,则需要在拥有该属性的类中触发该事件。
在您的示例中,您没有在Song类中触发事件。
这是您应该如何正确触发事件的方法:
1 2 3 4 5 6 7 8 | class Song { prop IsSelected { get { return this.selected; } set { this.selected = value; PropertyChanged("IsSelected"); } } } |
旧:
您能告诉我们InvokePropertyChanged在做什么吗?
方法ToggleAllSelection从何而来?
抱歉,我将此作为答案。 我还不能发表评论。