我想问一下为什么每次向下滚动数据网格时都会触发Checked事件。以下是我正在使用的代码:
<DataGrid x:Name="dgUser" HorizontalAlignment="Left" Margin="10,243,0,0" VerticalAlignment="Top" Width="433"
ItemsSource="{Binding Person, Mode=TwoWay}" AutoGenerateColumns="False" Height="216"
SelectedItem="{Binding SelectedPerson, Mode=TwoWay}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="ALL">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<mvvm:EventToCommand Command="{Binding DataContext.CheckAllUser,
RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<mvvm:EventToCommand Command="{Binding DataContext.UnCheckAllUser,
RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="UserName" Binding="{Binding Path=User.UserName}" />
<DataGridTextColumn Header="Email" Binding="{Binding Path=User.Email}" />
</DataGrid.Columns>
</DataGrid>
答案 0 :(得分:1)
我想问一下,当我向下滚动带有复选框的数据网格时,为什么会触发
Checked
事件。
由于虚拟化。只有当前可见行的可视元素保存在内存中,当您滚动时,容器会被重用于其他项目。
因此,当您将一行滚动到视图中时,IsChecked
的{{1}}属性将设置为CheckBox
源属性的值,然后IsChecked
事件为提高。
您可以通过将Checked
的{{1}}附加属性设置为false来禁用虚拟化:
VirtualizingPanel.IsVirtualizing
请注意,这可能会对滚动性能产生负面影响。
另一个选项是处理在DataGrid
源属性的setter中执行命令的逻辑,并去掉视图中的交互触发器。在setter中,您可以轻松确定属性是否实际设置为新值。