WPF点击DataGrid单元格时触发事件

6

我希望当用户点击WPF DataGrid中的单元格时,能够触发一个事件。我已经尝试了以下方法:

XAML

   <DataGridComboBoxColumn.ElementStyle>
      <Style TargetType="ComboBox">
         <EventSetter Event="GotFocus" Handler="b1SetColor"/>
      </Style>
   </DataGridComboBoxColumn.ElementStyle>

C#

  void b1SetColor(object sender, RoutedEventArgs e)
  {
     MessageBox.Show("Focused");
  }

但是当我点击组合框单元格时,什么也没有发生(不触发事件)。有没有办法可以实现这个功能?

4个回答

12

使用 DataGridCellStyle 并挂钩 PreviewMouseDown 事件。

<DataGrid>
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <EventSetter Event="PreviewMouseDown" Handler="b1SetColor"/>
        </Style>
    </DataGrid.CellStyle>
</DataGrid>

你如何在不破坏单元格中继承的其他样式的情况下完成这个操作? - Robert Harvey
@RobertHarvey,您可以创建一个“Style”,并使用“BasedOn”基于另一个“Style”。 - Sheridan

5

DataGrid级别上,您可以订阅SelectedCellsChanged事件:

XAML:

<DataGrid SelectedCellsChanged="selectedCellsChanged"/>

C#:

void selectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
    MessageBox.Show("Clicked");
}

2
我认为这只有在选择不同中的单元格时才会触发。如果用户选择同一行中的不同单元格(即不同列),则不会触发此操作。如果我错了,请纠正我。 - Nir Lanka
即使所选单元格与先前选择的单元格在同一行,它仍会触发。 - Volkan Sen
NirmaIL是正确的。只有在点击其他行时才触发。 - Adam Ri

2
将此添加到网格中。
 SelectionUnit="Cell"

然后使用@PiotrWolkowski提供的selectedCellsChanged解决方案。更改SelectionUnit将使其即使是相同的行也会触发。


1
  • 确保您已注册到:SelectedCellsChanged(而不是SelectionChanged)

  • 设置SelectionUnit="Cell"

  • 在您的处理程序中,获取所选单元格并提取绑定的项:

          if (e.AddedCells.Count == 0)
          {
              lblSelectedItem.Content = "";
              return;
          }
          var cellAdded = e.AddedCells[0];
          var product = cellAdded.Item as Product;
    
  • 然后通过DisplayIndex切换找到正确的属性:

          if (cellAdded.Column.DisplayIndex == 0)
          {
              lblSelectedItem.Content = product.Id;
          }
          else
          {
              lblSelectedItem.Content = product.Name;
          }
    
我对WPF相对于WinForms的复杂程度感到非常失望。为什么他们没有想到一个简单的CellChanged事件,处理起来如此轻松呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接