如您所知,在Windows C#的gridview中,如果我们想在单元格上处理单击/双击事件,那么就会出现CellClick,CellDoubleClick等事件。
所以,我想和WPF DataGrid的windows gridview一样。我到目前为止搜索过,但这两个答案都不适用也没用。他们中的一些人说使用MouseDoubleClick事件但是,在这种情况下,我们必须检查每一行以及该行中的项目,因此检查每个单元格中的数据和时间是非常耗时的。
我的DataGrid与DataTable绑定,AutoGeneratedColumn为False。如果您的答案基于AutoGeneratedColumn = True,则无法进行。甚至,我正在根据数据更改datagrid单元格的样式,因此无法更改AutoGeneratedColumn属性。
单元格单击/双击单击事件应该与Windows网格的事件一样快。如果有可能那么告诉我如何,如果没有,那么可以选择做什么呢?
请帮助我.....
非常感谢....
答案 0 :(得分:5)
另一种方法是定义DataGridTemplateColumn
,而不是使用DataGridCheckBoxColumn
,DataGridComboBoxColumn
之类的预定义列,然后将事件处理程序添加到数据模板中定义的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>
并在我的视图模型中处理我的命令。