wpf listview标题中的复选框未检查所有项目

时间:2013-09-22 12:43:31

标签: c# wpf listview checkbox

我的WPF应用程序中有一个listview,第一列是Checkbox。此复选框绑定到我的模型的IsSelected属性,并且事件传播正确发生。

我在同一列的标题中也有一个复选框,并希望实现一个“全选”功能,它会检查所有列表视图项。

我可以附加到流程,看到数据在我去的时候正在改变并以编程方式更改模型中的数据,但它并没有在UI中反映出来。我也实现了INotifyPropertyChanged。

有人可以解释我在这里做错了什么..

相关代码部分如下所述。

XML:

<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>

代码:

 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

1 个答案:

答案 0 :(得分:1)

如果您希望触发属性更改属性,则需要在拥有该属性的类中触发该事件。

在您的示例中,您没有在Song类中触发事件。

这是你应该正确解雇事件的方法:

class Song
{
  prop IsSelected
  {
    get { return this.selected; }
    set { this.selected = value; PropertyChanged("IsSelected"); }
  }
}

<强> OLD: 你能告诉我们InvokePropertyChanged在做什么吗?

ToggleAllSelection方法来自哪里?

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

相关问题