如何用F#编写C#委托动作?

问题描述

如何在F#中实现C#动作?

我在C#代码后面有以下代码

public MainWindow()
        {
            InitializeComponent();
            viewmodel = new viewmodel();
            DataContext = viewmodel;
        }

        private void ListView_PreviewMouseLeftButtonUp(object _,MouseButtonEventArgs e)
        {
            _closeAdorner();
        
            // listView here equals object _  
            var listView = (ListView)e.source;
            var grid = (Grid)listView.Parent;
            var selecteditem = (InnerRow)listView.SelectedItem;
            viewmodel.Visit = selecteditem;
            viewmodel.LastName = selecteditem.LastName;
        
            var adornerLayer = AdornerLayer.GetAdornerLayer(grid);
            if (adornerLayer == null)
                throw new ArgumentException("datagrid does not have have an adorner layer");

            var adorner = new DataGridAnnotationAdorner(grid);
            adornerLayer.Add(adorner);
        
           _closeAdorner = () => adornerLayer.Remove(adorner);
        }

我正在尝试将其翻译为F#:

let handlePreviewMouseLeftButtonUp (obj: obj) (a,c) =
      let e = (obj :?> MouseButtonEventArgs)
      let listView = e.source :?> ListView   // This is the ListView control that was clicked.
      let grid = listView.Parent :?> Grid
          
      let selectedItem = c.InnerRows |> List.filter (fun r -> Some r.Id = c.SelectedInnerRow) |> List.head
    
      let adorner = DataGridAdorner(grid)

      let installAdorner =
        let adornerLayer = AdornerLayer.GetAdornerLayer(grid)
        if (adornerLayer.GetAdorners = []) then adornerLayer.Add(adorner) else adornerLayer.Remove(adorner)
 

最后一行: 如果(adornerLayer.GetAdorners = []),则adornerLayer.Add(adorner)else adornerLayer.Remove(adorner)

显然不能编译,也不正确。 C#_closeAdorner如何编写为在F#中具有相同的功能

谢谢。

TIA

解决方法

我不确定_closeAdornerInnerRowDataGridAdorner和其他元素是什么。无论如何,这里我修复了您代码中的某些(不是全部)语法问题:

let handlePreviewMouseLeftButtonUp(obj : obj) (e:MouseButtonEventArgs)  =
    let listView = e.Source        :?> ListView   // This is the ListView control that was clicked.
    let grid     = listView.Parent :?> Grid
        
    let selectedItem = listView.SelectedItem :?> InnerRow//  |> List.filter (fun r -> Some r.Id = c.SelectedInnerRow) |> List.head
    
    let adorner = DataGridAdorner(grid)

    let installAdorner =
        let adornerLayer = AdornerLayer.GetAdornerLayer(grid)
        if adornerLayer.GetAdorners(grid) = [||] then adornerLayer.Add(adorner) else adornerLayer.Remove(adorner)
    ()

在构造函数中,您可以添加事件处理程序,如下所示:

listView.MouseUp.AddHandler(MouseButtonEventHandler(handlePreviewMouseLeftButtonUp))

您也可以将其删除:

listView.MouseUp.RemoveHandler(MouseButtonEventHandler(handlePreviewMouseLeftButtonUp))

要创建通用的Action,您可以这样操作:

let action = Action<_,_>(handlePreviewMouseLeftButtonUp)

<_,_>对应于动作接收的参数数量。