1

试图从 MVVM 应用程序的窗口中检索 DialogResult 时,我偶然发现了这个先前的问题。实施建议的更改后,示例如下所示:

type DialogCloser() =

    static let DialogResultProperty =
        DependencyProperty.RegisterAttached("DialogResult", typeof<bool>, typeof<DialogCloser>, new PropertyMetadata(DialogResultChanged))

    static member GetDialogResult (a:DependencyObject) =
        a.GetValue(DialogResultProperty) :?> bool

    static member SetDialogResult (a:DependencyObject) (value:string) = 
        a.SetValue(DialogResultProperty, value)

    member this.DialogResultChanged (a:DependencyObject) (e:DependencyPropertyChangedEventArgs) =
        let window = a :?> Window
        match window with
        | null -> failwith "Not a Window"
        | _ -> window.DialogResult <- System.Nullable (e.NewValue :?> bool)

NowDialogResultChanged在声明之前使用,这在 F# 中当然不会计算。

我似乎找不到可行的解决方案,任何帮助将不胜感激。

4

1 回答 1

3

我不是 WPF 专家,但在这个相关的 C# 解决方案中,该DialogResultsChanged方法是静态的。如果您在 F# 中也将方法定义为静态,您应该能够在声明它之前引用它(使用全名DialogCloser.DialogResultsChanged),因此类似以下的内容应该可以解决问题:

type DialogCloser() =

    static let DialogResultProperty =
        DependencyProperty.RegisterAttached
            ( "DialogResult", typeof<bool>, typeof<DialogCloser>, 
              new PropertyMetadata(DialogCloser.DialogResultChanged))

    static member GetDialogResult (a:DependencyObject) =
        a.GetValue(DialogResultProperty) :?> bool

    static member SetDialogResult (a:DependencyObject) (value:string) = 
        a.SetValue(DialogResultProperty, value)

    static member DialogResultChanged 
            (a:DependencyObject) (e:DependencyPropertyChangedEventArgs) =
        let window = a :?> Window
        match window with
        | null -> failwith "Not a Window"
        | _ -> window.DialogResult <- System.Nullable (e.NewValue :?> bool)
于 2015-10-21T12:59:41.603 回答