我如何在WPF DataGrid上处理单元格双击事件,相当于Windows DataGrid的事件?

时间:2013-01-28 07:50:32

标签: wpf events datagrid cell

如您所知,在Windows C#的gridview中,如果我们想在单元格上处理单击/双击事件,那么就会出现CellClick,CellDoubleClick等事件。

所以,我想和WPF DataGrid的windows gridview一样。我到目前为止搜索过,但这两个答案都不适用也没用。他们中的一些人说使用MouseDoubleClick事件但是,在这种情况下,我们必须检查每一行以及该行中的项目,因此检查每个单元格中的数据和时间是非常耗时的。

我的DataGrid与DataTable绑定,AutoGeneratedColumn为False。如果您的答案基于AutoGeneratedColumn = True,则无法进行。甚至,我正在根据数据更改datagrid单元格的样式,因此无法更改AutoGeneratedColumn属性。

单元格单击/双击单击事件应该与Windows网格的事件一样快。如果有可能那么告诉我如何,如果没有,那么可以选择做什么呢?

请帮助我.....

非常感谢....

4 个答案:

答案 0 :(得分:5)

另一种方法是定义DataGridTemplateColumn,而不是使用DataGridCheckBoxColumnDataGridComboBoxColumn之类的预定义列,然后将事件处理程序添加到数据模板中定义的UI元素。

下面我为MouseDown Cell定义了一个TextBlock事件处理程序。

<DataGrid AutoGenerateColumns="False">
    <DataGrid.Columns>

        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock MouseDown="TextBlock_MouseDown"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

在代码隐藏文件中:

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
    TextBlock block = sender as TextBlock;
    if (block != null)
    {
        // Some Logic
        // block.Text
    }
}

答案 1 :(得分:4)

我知道这对派对来说可能有点晚了,但这对其他人来说可能有用。

在MyView.xaml中:

private void DataGridCell_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var dataGridCellTarget = (DataGridCell)sender;
    // TODO: Your logic here
}

在MyView.xaml.cs中:

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var companyTableView: UITableView!

var psgTextField: UITextField?
var emTextField: UITextField?


var passengers = [""]
var button: UILabel?

override func viewDidLoad() {
    super.viewDidLoad()
    configureButton()

    companyTableView.delegate = self
    companyTableView.dataSource = self

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return passengers.count
}


@objc func buttonTapped(sender: UITapGestureRecognizer) {
    let alertController = UIAlertController(title: "Enter name and email",
                                            message: nil,
                                            preferredStyle: .alert)
    alertController.addTextField(configurationHandler: psgTextField)
    alertController.addTextField(configurationHandler: emTextField)

    let okAction = UIAlertAction(title: "Submit", style: .default, handler: self.okHandler)
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

    alertController.addAction(okAction)
    alertController.addAction(cancelAction)

    self.present(alertController, animated: true)


}

func psgTextField(textField: UITextField!) {
    psgTextField = textField
    psgTextField?.placeholder = "Name"
}

func emTextField(textField: UITextField!) {
    emTextField = textField
    emTextField?.placeholder = "Email"
}

func okHandler(alert: UIAlertAction!) {

    let psgStr = (psgTextField?.text)!

    passengers.removeLast()
    passengers.append(psgStr)
    passengers.append("")

}

func configureButton() {
    button = UILabel()
    let frame = CGRect(x: 0, y: 5, width: 300, height: 30)
    button?.frame = frame
    button?.text = "            Add Passenger"
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(buttonTapped(sender:)))
    button?.addGestureRecognizer(tapGesture)
    button?.isUserInteractionEnabled = true
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let passenger = passengers[indexPath.row]
    if let cell = companyTableView.dequeueReusableCell(withIdentifier: "cell") {
        cell.textLabel?.text = passenger

        if cell.textLabel?.text == "" {
            cell.contentView.addSubview(button!)
        } else {
            // Nothing
        }

        return cell
    }

    return UITableViewCell()


}
}

答案 2 :(得分:3)

我知道编码WPF有时候是PITA。无论如何,您必须处理MouseDoubleClick事件。然后搜索源对象层次结构以查找DataGridRow并对其执行任何操作。

更新:示例代码

XAML

<dg:DataGrid MouseDoubleClick="OnDoubleClick" />

背后的代码

private void OnDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject source = (DependencyObject) e.OriginalSource;
    var row = GetDataGridRowObject(source);
    if (row == null)
    {
         return;
    }
    else
    {
        // Do whatever with it
    }
    e.Handled = true;
}

private DataGridRow GetDataGridRowObject(DependencyObject source)                               
{
    // Write your own code to recursively traverse up via the source
    // until you find a DataGridRow object. Otherwise return null.
}

}

答案 3 :(得分:0)

我用过这样的东西:

<DataGrid.InputBindings>
    <MouseBinding Gesture="LeftDoubleClick" Command="{Binding ShowOverlay}" CommandParameter="{Binding Parameter}" />
</DataGrid.InputBindings>

并在我的视图模型中处理我的命令。