当我向下滚动datagrid

时间:2018-03-16 11:55:08

标签: c# wpf

我有一个简单的数据网格,其中一列包含一个复选框:

<DataGrid>
  <DataGrid.Columns>
    <DataGridTemplateColumn>
      <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <CheckBox Checked="CheckBox_Checked">
            <CheckBox.Style>
              <Style TargetType="{x:Type CheckBox}">
                <Style.Triggers>
                  <DataTrigger Binding="{Binding anotherColumn}" Value="2">
                    <Setter Property="IsChecked" Value="True"/>
                  </DataTrigger>
                  <DataTrigger Binding="{Binding anotherColumn}" Value="1">
                    <Setter Property="IsChecked" Value="False"/>
                  </DataTrigger>
                </Style.Triggers>
              </Style>
            <CheckBox.Style>
          </CheckBox>
        </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
  </DataGrid.Columns>
</DataGrid>

我使用datatrigger将该复选框绑定到另一列,因此它将导致选中或取消选中该复选框。因此,我的一些复选框将被取消选中,其他一些将根据anotherColumn的值进行检查。请注意,我的复选框有一个Checked事件处理程序。

问题是,如果我向下滚动数据网格,当它到达选中的复选框时,将会触发“已检查”事件。这个问题发生在我向下滚动数据网格时,WPF呈现新的复选框并在场景中显示它们,而不是在数据网格的开头。

为了避免这种副作用我尝试使用MouseLeftButtonDown和PreviewMouseLeftButtonDown事件而不是Checked事件来捕获复选框功能,但MouseLeftButtonDown事件不会触发复选框(根据此documnetation)和PreviewMouseLeftButtonDown有一些副作用(例如,它会捕获用户的点击,但不会检查复选框)

我想知道是否有任何想法以不同的方式捕获复选框检查事件或任何可以解决第一个提到错误事件被触发的问题的想法。

1 个答案:

答案 0 :(得分:0)

正如Manfred在评论中所说,我只需要关心我的ViewModel来解决这个问题。出现这种意外行为是因为我使用dataTrigger来检查和取消选中Checkbox.Instead我应该使用viewModel将我的复选框绑定到itemsource。

Here是在datagrid中使用复选框的一个很好的例子 here是对MVVM模式的良好表达。