1

我正在构建一个 POS 应用程序,我希望最终用户能够为数据网格设置切换选择模式,即他们可以单击多行,并且每个单击的项目都将累积在 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 时,单击时不会触发按钮命令,因为我e.Handled = true;在上面的代码中进行了设置以停止事件气泡。有没有办法可以同时兼顾两者?

4

3 回答 3

1

也许您可以尝试在按钮上放置一个 AttachedBehavior?通过这种方式,您可以从图片中获取命令并处理 AttachedBehavior 中的单击事件。

于 2012-08-24T15:24:45.790 回答
1

您也可以使用一个复选框来执行此操作,该复选框将在相应行上切换选择。

<DataGrid.RowHeaderTemplate>
   <DataTemplate>
      <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay,
                           RelativeSource={RelativeSource FindAncestor,
                           AncestorType={x:Type DataGridRow}}}"/>
   </DataTemplate>
</DataGrid.RowHeaderTemplate>
于 2016-01-26T18:22:48.100 回答
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 模式。

于 2012-08-24T16:55:51.393 回答