DialogResult в F#

Пытаясь извлечь DialogResult из окна в приложении MVVM, я наткнулся на этот предыдущий вопрос. После внесения предложенных изменений образец выглядит следующим образом:

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)

Сейчас DialogResultChanged используется перед объявлением, что, конечно, не вычисляется в F#.

Я не могу найти рабочее решение, любая помощь будет оценена.

1 ответ

Решение

Я не эксперт 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)
Другие вопросы по тегам