【问题标题】:F# WPF CommandsF# WPF 命令
【发布时间】:2012-04-01 21:52:36
【问题描述】:

我不明白如何在 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()

您需要进行哪些更改才能使其正常工作?最好是最简单的方法。

【问题讨论】:

  • 这是一个相当模糊的问题——到目前为止你尝试过什么?或者您有想要翻译成 F# 的 C# 示例?
  • 我没有 C# 源代码。我试图制作从某个模块调用某些函数的命令。并将此命令绑定到某个控件(主题代码中的按钮)。
  • 并不是你的问题的真正答案,但 Daniel Mohl 整理了一些出色的模板,用于将 F# 与 WP7 结合使用。因此,他们提供了将 F# 与 WPF/Xaml 结合使用的绝佳示例。你可能想看看他的模板——它们在 Visual Studio 库中
  • 我认为这个链接就是@OnorioCatenacci 所说的:visualstudiogallery.msdn.microsoft.com/…

标签: .net wpf f# command


【解决方案1】:

命令是一种实现ICommand 接口的类型。因此,如果您想在 F# 中创建命令,则需要实现该接口,请参阅Interfaces (F#)

【讨论】:

  • 好的,我在答案中更改了代码。现在得到错误Missing XmlNamespace, Assembly or ClrNamespace in Mapping instruction.
【解决方案2】:

我不知道这是否是您当前错误的根源,但创建 add_CanExecuteChangedremove_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

【讨论】:

  • 已解决!我添加了带有公共字段和命令的 ViewModel 类,设置了新的 Window 实例,其中 DataContext 是 ViewModel 实例,并将数据绑定设置为命令和公共。所有作品。谢谢大家
  • 太棒了!如果这个答案解决了问题,您应该单击它旁边的绿色复选标记,以便将来的搜索者知道它而无需阅读 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2010-09-30
  • 1970-01-01
  • 2016-07-08
  • 2010-09-14
  • 2010-10-21
  • 2010-12-07
相关资源
最近更新 更多