こんな基本クラスを用意しておくと記述が楽かも。まぁ同じことはC#でも言えますが。
ネタ元は以下の記事です。
open System
open System.ComponentModel
/// INotifyPropertyChangedの実装
type NotifyObject() =
let propertyChangedEvent = Event<_, _>()
interface INotifyPropertyChanged with
[<CLIEvent>]
member x.PropertyChanged = propertyChangedEvent.Publish
/// プロパティのsetterの実装簡略化用メソッド
member x.SetProperty((field : 'a byref), (value : 'a), (name : string)) =
if field = value then
()
else
field <- value
propertyChangedEvent.Trigger(x, PropertyChangedEventArgs(name))
/// お試し実装
type HogeViewModel() =
inherit NotifyObject()
let mutable name = "default value"
member x.Name
with get() = name
and set v = x.SetProperty(&name, v, "Name")
// 使ってみる
let vm = HogeViewModel()
// PropertyChangedがちゃんと動いてるか確認用イベントハンドラを登録
let p = vm :> INotifyPropertyChanged
p.PropertyChanged.Add <| fun e -> (printfn "%s property changed" e.PropertyName)
// レッツ代入
vm.Name <- "田中"
printfn "name = %s" vm.Name
vm.Name <- "Tanaka"
printfn "name = %s" vm.Name実行すると、以下のような結果になります。ちゃんと動いてるくさい。
Name property changed name = 田中 Name property changed name = Tanaka
プロパティ名を文字列で指定してるところを、タイプセーフに指定できるようにすればOKだ。F#だと<@ ... @>みたいに書くんだったかな。後で調べよう。