Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#WPF:处理列表框中的单击事件_Wpf_F#_Fsharp.viewmodule - Fatal编程技术网

F#WPF:处理列表框中的单击事件

F#WPF:处理列表框中的单击事件,wpf,f#,fsharp.viewmodule,Wpf,F#,Fsharp.viewmodule,我正在尝试使用F#和WPF创建一个简单的任务调度器。它基本上只是一个任务列表,其中每个任务都有一个“删除”按钮。处理列表之外的按钮单击不是问题——这可以通过常规命令来处理。但是,在列表项中处理按钮单击并不简单。我尝试使用RelayCommand,该命令通过路由到父对象的绑定进行描述,但发送方对象始终为null(我希望它是集合中的任务对象)。还尝试按建议附加属性,但无法使其正常工作 如何分配一个事件处理程序,通过单击“删除”按钮获取任务对象 以下是App.fs: namespace ToDoApp

我正在尝试使用F#和WPF创建一个简单的任务调度器。它基本上只是一个任务列表,其中每个任务都有一个“删除”按钮。处理列表之外的按钮单击不是问题——这可以通过常规命令来处理。但是,在列表项中处理按钮单击并不简单。我尝试使用RelayCommand,该命令通过路由到父对象的绑定进行描述,但发送方对象始终为null(我希望它是集合中的任务对象)。还尝试按建议附加属性,但无法使其正常工作

如何分配一个事件处理程序,通过单击“删除”按钮获取任务对象

以下是App.fs:

namespace ToDoApp

open System
open System.Windows
open System.Collections.ObjectModel
open System.Windows.Input
open FSharp.ViewModule
open FSharp.ViewModule.Validation
open FsXaml

type App = XAML<"App.xaml">
type MainView = XAML<"MainWindow.xaml">

type Task(str) = 
    member x.Description with get() = str

type MainViewModel() as self = 
    inherit ViewModelBase()  

    let tasks = new ObservableCollection<Task>()

    let addTaskCommand() =
        let descr = sprintf "Do something at %A" (DateTime.Now.AddMinutes(30.0))
        tasks.Add <| new Task(descr)

    member this.Tasks with get() = tasks
    member this.AddTask = this.Factory.CommandSync addTaskCommand

module main =
    [<STAThread>]
    [<EntryPoint>]
    let main argv =
        App().Run()
namespace ToDoApp
开放系统
开放系统
open System.Collections.ObjectModel
打开System.Windows.Input
打开FSharp.ViewModule
打开FSharp.ViewModule.Validation
打开FsXaml
类型App=XAML
类型MainView=XAML
类型任务(str)=
get()=str的成员x.Description
键入MainViewModel()作为self=
继承ViewModelBase()
让任务=新的ObservableCollection()
让addTaskCommand()=
让descr=sprintf“在%A做点什么”(DateTime.Now.AddMinutes(30.0))

任务。添加最好坚持命令:

视图模型

member __.DelTask = 
    __.Factory.CommandSyncParam 
        (fun task -> tasks.Remove task |> ignore)
XAML

<Button Grid.Column="1" 
        Command="{Binding DataContext.DelTask, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
        CommandParameter="{Binding}"
        >Delete</Button>
删除

在XAML中使用事件处理程序会产生难以测试和维护的意大利面代码(即,分离关注点,将业务逻辑问题与UI问题分开处理)。

效果非常好!非常感谢。