动态生成的 DataGrid 第二次单击 CheckBox 在 WPF

时间:2021-04-30 23:06:11

标签: wpf datagrid prism

问题 1:我在动态生成的 DataGrid 中遇到了众所周知的双击问题。我有带复选框的第一列。需要点击两次才能进行选择/取消选择。 为了解决这个问题,我添加了以下代码。 注意:我们添加了 Behavior 类来处理与 DataGrid 相关的所有内容。

解决方案 1

xaml:
<DataGrid Name="MyDg" AutoGeneratedColumns="False" MouseLeftButtonUp="_MyGridRowLeftButtonUp" />

xaml.cs:

private void _MyGridRowLeftButtonUp(object sender, MouseButtonEventArgs e)
{
   if(MyDg.CurrentColumn.DisplayIndex == 0) //Making sure user clicked on first col, ignoring other cell clicks
   {
      ((MyViewModel)MyDg.SelectedItem).IsSelected = !((MyViewModel)MyDg.SelectedItem).IsSelected;
   }
}

所以这个解决方案是有效的,只需单击一下,我就可以选择/取消选择复选框,并且下面的属性也得到了正确设置。 注意:仍然不是 100% 完美的解决方案,因为我正在处理第一列单元格上的点击,而不是完全来自复选框。如果对此有更好的解决方案,请提出建议,那时我可能不需要以下解决方法。

问题 2: 由于 MouseLeftButtonUp 事件直接在 Grid 上,因此单击网格上的任意位置也会被处理。真正的问题是,如果在特定单元格(复选框)上有焦点(选定),然后用户单击其他任何地方,则该单击也被视为复选框单击。

解决方案 2: 所以我不得不缩小点击区域/事件的范围。因此只为 Row 添加了它,所以只会处理 rowclick。

xaml:
<DataGrid Name="MyDg" AutoGeneratedColumns="False">
<DataGrid.ItemContainerStyle>
   <Style TargetType="DataGridRow">
      <EventSetter Event="MouseLeftButtonUp" Handler="_MyGridRowLeftButtonUp"></EventSetter>
   </Style>
</DataGrid.ItemContainerStyle>
</DataGrid>

所以这也很好用,直到我发现了以下问题。

问题 3: 我注意到,如果我再次单击相同的复选框,然后在第二次单击事件时它不会触发,但是在 UI 上您会看到效果,这意味着您将看到复选框被选中/取消选中。 看起来当第一次在任何复选框上有新的点击(焦点改变)时,事件就会被触发。如果您点击之前点击过的另一个复选框,这次也不会触发。

  • 如果我点击列标题(排序),那么我猜会发生某种刷新,然后点击工作(再次仅第一次)。

我尝试过使用 PreviewMouseLeftButtonUp,它也提供了相同的行为。那么是否可以在每次点击后调用任何失去焦点的事件,以便确定触发下一次点击事件,或者是否有任何其他整体解决方案来完成问题。 感谢帮助。

1 个答案:

答案 0 :(得分:0)

您忘记在问题中包含实际 CheckBox 的示例,但如果您使用 DataGridTemplateColumn(而不是 DataGridCheckBoxColumn)并使用绑定 IsChecked 属性UpdateSourceTrigger=PropertyChanged 应立即设置源属性:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
相关问题