关于C#:WPF ListView标头中的复选框未检查所有项目

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从何而来?

抱歉,我将此作为答案。 我还不能发表评论。