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