Команды F # WPF - PullRequest
       47

Команды F # WPF

1 голос
/ 16 марта 2012

Я не понимаю, как работают с командами в WPF. Например, у меня есть xaml-файл вроде этого:

MainWindow.xaml:

 <Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="assembly=FSharpOnly"
  xmlns:Commands="clr-namespace:View.Commands"
  Title="Sample F# WPF Application Written Only in F#"
  Height="700"
  Width="900">
    <DockPanel LastChildFill="True">
        <TextBlock DockPanel.Dock="Bottom" Background="Aqua"></TextBlock>
        <TextBox DockPanel.Dock="Right" Background="Brown" Width="200"></TextBox>
        <WrapPanel DockPanel.Dock="Top" Background="DimGray">
            <Button Margin="3" Command="Commands:load_tests_command">Загрузить проверки</Button>
            <Button Margin="3">Обновить проверки</Button>
        </WrapPanel>
        <TextBox DockPanel.Dock="Left" Background="Beige">Текст слева</TextBox>
    </DockPanel>
</Window>

и файл, в котором я хочу определить команду load_tests:

module View.Commands
open System.Windows.Input

open TestLoader

(* commands *)
type LoadTestsCommand () = 
    interface ICommand with
        member this.CanExecute (obj) = true
        member this.Execute (obj) = reload_tests()
        member this.add_CanExecuteChanged (obj) = ()
        member this.remove_CanExecuteChanged (obj) = ()

let load_tests_command =
    LoadTestsCommand()

Что нужно изменить, чтобы оно заработало? Желательно самый простой способ.

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Я не знаю, является ли это источником вашей текущей ошибки, но создание методов add_CanExecuteChanged и remove_CanExecuteChanged не является правильным способом реализации события CanExecuteChanged. Я бы сделал это примерно так:

type LoadTestsCommand () = 
    let canExecuteChanged = new Event<_>()
    interface ICommand with
        member this.CanExecute (obj) = true
        member this.Execute (obj) = reload_tests()
        [<CLIEvent>]
        member this.CanExecuteChanged = canExecuteChanged.Publish
1 голос
/ 16 марта 2012

Команда - это тип, который реализует интерфейс ICommand .Поэтому, если вы хотите создать команду в F #, вам нужно реализовать этот интерфейс, см. Интерфейсы (F #)

...