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