问题 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,它也给出了相同的行为。那么每次单击后是否可以调用任何丢失焦点类型的事件,以便确保下一次单击事件触发,或者是否有任何其他整体解决方案来完成问题。 感谢帮助。
您忘记在问题中包含实际
CheckBox
的示例,但如果您使用 DataGridTemplateColumn
(而不是 DataGridCheckBoxColumn
)并使用 IsChecked
绑定 UpdateSourceTrigger=PropertyChanged
属性,则应立即设置源属性:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我无法发表评论,但你找到问题 3 的解决方案了吗,我遇到了完全相同的问题
我可以看到 DataGridCell 的内容是正确的检查状态,但该单元格的 DataGrid.CurrentItem 不是