2012-03-16 4 views
1

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

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() 

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

+0

Это довольно смутный вопрос - что вы пробовали до сих пор? Или у вас есть образец C#, который вы хотите перевести на F #? –

+0

У меня нет источников C#. Я пытаюсь сделать команду, которая вызывает некоторую функцию из некоторого модуля. И привязка этой команды к некоторому управлению (кнопка в коде темы). – psct

+2

Не совсем ответ на ваш вопрос, но Даниэль Мохл собрал несколько отличных шаблонов для использования F # с WP7. Как следствие, у них отличные примеры использования F # с WPF/Xaml. Вы можете посмотреть его шаблоны - они находятся в Visual Studio Gallery –

ответ

4

Я не знаю, если это источник вашей текущей ошибки, но создание 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 
+0

Решено! Я добавил класс ViewModel с общедоступными полями и командами, установил новый экземпляр Window, где DataContext является экземпляром ViewModel и устанавливает привязки данных к командам и публикациям. Все работает. Спасибо всем – psct

+0

Отлично! Если этот ответ решил проблему, вы должны нажать зеленую галочку рядом с ней, чтобы будущие поисковики знали это, не прочитав комментарии. –

1

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

+0

нормально, я изменил код в ответ. И теперь получите ошибку 'Missing XmlNamespace, Assembly или ClrNamespace в инструкции Mapping.' – psct