Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

F#版のBindableBaseクラス

$
0
0

F#でINotifyPropertyChangedを実装するとどうなるかな~というので実装してみた。

open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Quotations.Patterns
open Microsoft.FSharp.Quotations.DerivedPatterns

type BindableBase() =
    let propertyChnged = Event<_, _>()
    interface System.ComponentModel.INotifyPropertyChanged with
        [<CLIEventAttribute>]
        member x.PropertyChanged = propertyChnged.Publish

    member x.Set<'T>((field: 'T byref), value, propertyExpression) =
        if (System.Object.Equals(field, value)) then
            false
        else
            field <- value

            match propertyExpression with
            | PropertyGet(_, info, _) -> propertyChnged.Trigger(x, System.ComponentModel.PropertyChangedEventArgs(info.Name))
            | _ -> ()

            true

SetメソッドのpropertyExpressionは、F#のコード クォート (F#)を使ってタイプセーフにプロパティ名を指定できるようにしてみました。使い方はこんな感じ。

type Person() =
    inherit BindableBase()

    let mutable name =""
    member this.Name 
        with get() = name
        and set(v) = this.Set(&name, v, <@ this.Name @>) |> ignore
let p = Person()
(p :> System.ComponentModel.INotifyPropertyChanged).PropertyChanged.Add(fun e -> printfn "%s" e.PropertyName)
p.Name <- "aaa"
printfn "%s" p.Name

実行すると

Name
aaa

と表示される。


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>