【发布时间】:2017-11-27 08:29:42
【问题描述】:
TL;DR:如何从表单的引用中获取实际的属性值
<@ myInstance.myProperty @>
我正在尝试使用 F# 简化 INotifyPropertyChanged。我不想直接订阅 PropertyChanged,而是想使用一种方法,该方法采用包含我要订阅的属性的代码引用(例如<@ vm.IsChanged @>)和回调(或者只是引用并返回相关属性的可观察值) .例如:
type MyVm() =
inherit INPCBaseWithObserveMethod()
...
let vm = new MyVm()
vm.Observe <@ vm.IsChanged @> (fun isChanged -> ...)
我是代码引用的新手,我正在努力实现Observe 方法。我知道如何从这种表达式中获取属性 name,但不知道 value。这是我目前所拥有的(注意propInfo.GetValue 中的占位符):
type ViewModelBase() =
// Start INPC boilerplate
let propertyChanged = new Event<_, _>()
interface INotifyPropertyChanged with
[<CLIEvent>]
member __.PropertyChanged = propertyChanged.Publish
member this.OnPropertyChanged(propertyName : string) =
propertyChanged.Trigger(this, new PropertyChangedEventArgs(propertyName))
// End INPC boilerplate
member this.Observe (query: Expr<'a>) (callback: 'a -> unit) : unit =
match query with
| PropertyGet(instanceExpr, propInfo, _) ->
(this :> INotifyPropertyChanged).PropertyChanged
|> Observable.filter (fun args -> args.PropertyName = propInfo.Name)
|> Observable.map (fun _ -> propInfo.GetValue(TODO) :?> 'a)
|> Observable.add callback
| _ -> failwith "Expression must be a non-static property getter"
【问题讨论】:
标签: f# quotations