我正在构建一个POS应用程序,我希望最终用户能够为数据网格提供切换选择模式,I.E。他们可以单击多行,每个单击的项目将累积在SelectedItems属性上 - 同时单击已选中的行将取消选择该行。我在另一个stackoverflow问题中找到了这段代码:
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="DoCheckRow" />
</Style>
</DataGrid.Resources>
public void DoCheckRow(object sender, MouseButtonEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
if (cell != null && !cell.IsEditing)
{
DataGridRow row = VisualHelpers.TryFindParent<DataGridRow>(cell);
if (row != null)
{
row.IsSelected = !row.IsSelected;
e.Handled = true;
Debug.WriteLine(sender);
}
}
}
有效地为切换选择模式提供了我想要的东西,但是,当我将按钮添加为CellTemplate时,单击时不会触发buttons命令,因为我在设置e.Handled = true;
以上代码可以阻止事件冒泡。有没有办法可以容纳两者?
答案 0 :(得分:1)
也许您可以尝试在按钮上添加AttachedBehavior?这样您就可以从图片中取出命令并处理AttachedBehavior中的click事件。
答案 1 :(得分:0)
我能够通过使用一些辅助函数来找到可视的子/父和一些命中测试来解决它:
public void DoCheckRow(object sender, MouseButtonEventArgs e)
{
DataGridCell cell = sender as DataGridCell;
if (cell != null && !cell.IsEditing)
{
DataGridRow row = VisualHelpers.TryFindParent<DataGridRow>(cell);
if (row != null)
{
Button button = VisualHelpers.FindVisualChild<Button>(cell, "ViewButton");
if (button != null)
{
HitTestResult result = VisualTreeHelper.HitTest(button, e.GetPosition(cell));
if (result != null)
{
// execute button and do not select / deselect row
button.Command.Execute(row.DataContext);
e.Handled = true;
return;
}
}
row.IsSelected = !row.IsSelected;
e.Handled = true;
}
}
}
虽然它不是最优雅的解决方案,但它适用于我使用的MVVM模式。
答案 2 :(得分:0)
您也可以使用一个复选框来执行此操作,该复选框将在相应的行上切换选择。
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGridRow}}}"/>
</DataTemplate>
</DataGrid.RowHeaderTemplate>