Interaction.Triggers里面的datagrid自动触发器中的复选框

时间:2017-09-11 14:22:40

标签: c# wpf xaml mvvm

我想问一下为什么每次向下滚动数据网格时都会触发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>

下面是我的屏幕截图。 enter image description here

1 个答案:

答案 0 :(得分:1)

  

我想问一下,当我向下滚动带有复选框的数据网格时,为什么会触发Checked事件。

由于虚拟化。只有当前可见行的可视元素保存在内存中,当您滚动时,容器会被重用于其他项目。

因此,当您将一行滚动到视图中时,IsChecked的{​​{1}}属性将设置为CheckBox源属性的值,然后IsChecked事件为提高。

您可以通过将Checked的{​​{1}}附加属性设置为false来禁用虚拟化:

VirtualizingPanel.IsVirtualizing

请注意,这可能会对滚动性能产生负面影响。

另一个选项是处理在DataGrid源属性的setter中执行命令的逻辑,并去掉视图中的交互触发器。在setter中,您可以轻松确定属性是否实际设置为新值。