C#委托操作是如何用F#编写的?

C#委托操作是如何用F#编写的?,f#,delegates,F#,Delegates,如何在F中实现C操作 我在C#代码隐藏中有以下代码: public MainWindow() { InitializeComponent(); ViewModel = new ViewModel(); DataContext = ViewModel; } private void ListView_PreviewMouseLeftButtonUp(object _, Mous

如何在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#:

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

显然无法编译且不正确。如何编写C###U closeAdorner以使其在F中具有相同的功能?

多谢各位


TIA

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

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))
let action = Action<_,_>(handlePreviewMouseLeftButtonUp)
您还可以删除它:

listView.MouseUp.RemoveHandler(MouseButtonEventHandler(handlePreviewMouseLeftButtonUp))
要创建通用的
操作
s,请执行以下操作:

listView.MouseUp.AddHandler(MouseButtonEventHandler(handlePreviewMouseLeftButtonUp))
let action = Action<_,_>(handlePreviewMouseLeftButtonUp)
let action=action(handlePreviewMouseLeftButtonUp)

其中,
对应于操作接收的参数数量。

在C#
e中,是第二个参数,但在F中,您试图将第一个参数作为事件参数来处理reason@FyodorSoikin我相信订单是在Elmish.WPF中切换的--我可能错了。我相信这将完成我的任务,但是如何将代码作为F#中的“动作”来编写呢?谢谢。我修复了函数声明,因为它是错误的,并且还添加了如何将处理程序添加到事件中