Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
使用WPF的事件驱动MVVM_Wpf_Mvvm_F# - Fatal编程技术网

使用WPF的事件驱动MVVM

使用WPF的事件驱动MVVM,wpf,mvvm,f#,Wpf,Mvvm,F#,我已经使用了几个星期(第一次在F#中使用设计模式),我喜欢分离视图和模型以及“功能”控制器的想法。但是当我翻阅一本关于WPF的书时,我感觉如果我能直接处理事件会更容易。此外,在某些情况下,我需要从代码隐藏中获取控件 更具体地说: 如何关闭XAML文件中定义为usercontrol的窗口 如果我能直接处理事件,似乎对按钮(触发保持状态的布尔值)的需求会减少,结果会有更自动化的感觉 有人和我分享过这段经历吗?还是我还错过了什么?建议回到FsXaml或polyglot MVVM吗?事实证明,代码实

我已经使用了几个星期(第一次在F#中使用设计模式),我喜欢分离视图和模型以及“功能”控制器的想法。但是当我翻阅一本关于WPF的书时,我感觉如果我能直接处理事件会更容易。此外,在某些情况下,我需要从代码隐藏中获取控件

更具体地说:

  • 如何关闭XAML文件中定义为usercontrol的窗口
  • 如果我能直接处理事件,似乎对按钮(触发保持状态的布尔值)的需求会减少,结果会有更自动化的感觉

有人和我分享过这段经历吗?还是我还错过了什么?建议回到FsXaml或polyglot MVVM吗?

事实证明,代码实际上很容易扩展。基于这一点,我能够将文本框转换成数字框。执行此操作的代码非常基本,但我的目的是定义一个自定义事件访问器。这可以通过以下方式实现:

使用以下内容扩展UserControl.xaml标头:

xmlns:fsxaml="http://github.com/fsprojects/FsXaml"   
fsxaml:ViewController.Custom="{x:Type views:CompositionUserControl}"
并替换UserControl.xaml.fs中的原始代码:

namespace Space.Views

open FsXaml

type UserView = XAML<"View/UserControl.xaml", true>

type CompositionUserControl () =

    member __.ViewModel = Space.ViewModels.UserControlViewModel(Space.Models.Handling.proces)
命名空间空间。视图
打开FsXaml
类型UserView=XAML
类型CompositionUserControl()=
成员_uu.ViewModel=Space.ViewModels.UserControlViewModel(Space.Models.Handling.proces)

命名空间空间。视图
打开FsXaml
开放系统
类型UserView=XAML
类型CompositionUserControl()=
继承UserControlViewController()
let numeric(txt:string)=
尝试使用txt |>int
| :? System.FormatException->0
| _ -> 1
覆盖此。已加载的视图=
view.Box.previewtextput.Add(乐趣e->如果数字e.Text=0,则e.Handled
namespace Space.Views

open FsXaml
open System

type UserView = XAML<"View/UserControl.xaml", true>

type CompositionUserControl () =
    inherit UserControlViewController<UserView>()

    let numeric (txt : string) =
        try txt |> int with
        | :? System.FormatException -> 0
        | _ -> 1

    override this.OnLoaded view = 
        view.Box.PreviewTextInput.Add(fun e -> if numeric e.Text = 0 then e.Handled <- true) 

    member __.ViewModel = Space.ViewModels.UserControlViewModel(Space.Models.Handling.proces)