我的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
答案 0 :(得分:1)
如果您希望触发属性更改属性,则需要在拥有该属性的类中触发该事件。
在您的示例中,您没有在Song类中触发事件。
这是你应该正确解雇事件的方法:
class Song
{
prop IsSelected
{
get { return this.selected; }
set { this.selected = value; PropertyChanged("IsSelected"); }
}
}
<强> OLD:强> 你能告诉我们InvokePropertyChanged在做什么吗?
ToggleAllSelection方法来自哪里?
抱歉,我将此作为答案。我还不能发表评论。