动态生成的DataGrid第二次单击CheckBox在WPF中不起作用

问题描述 投票:0回答:2

问题 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 事件直接发生在网格上,因此单击网格上的任意位置也会被处理。真正的问题是,如果焦点(选定)在特定单元格(复选框)上,然后用户单击其他任何位置,则该单击也被视为复选框单击。

解决方案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,它也给出了相同的行为。那么每次单击后是否可以调用任何丢失焦点类型的事件,以便确保下一次单击事件触发,或者是否有任何其他整体解决方案来完成问题。 感谢帮助。

wpf datagrid prism
2个回答
0
投票

您忘记在问题中包含实际

CheckBox
的示例,但如果您使用
DataGridTemplateColumn
(而不是
DataGridCheckBoxColumn
)并使用
IsChecked
绑定
UpdateSourceTrigger=PropertyChanged
属性,则应立即设置源属性:

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

0
投票

我无法发表评论,但你找到问题 3 的解决方案了吗,我遇到了完全相同的问题

我可以看到 DataGridCell 的内容是正确的检查状态,但该单元格的 DataGrid.CurrentItem 不是

© www.soinside.com 2019 - 2024. All rights reserved.