0

我的 WPF 应用程序中有一个列表视图,第一列是一个复选框。此复选框绑定到我的模型的 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");
            }

Songs 是一个 ObservableCollection

4

1 回答 1

1

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

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

这是您应该正确触发事件的方式:

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

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

ToggleAllSelection 方法从何而来?

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

于 2013-09-22T15:10:17.707 回答