Sco*_*rod 7 mono f# xamarin.forms
在改变对象成员后尝试观察新分配的值时,我正在观察数据提示上的错误消息。
视图模型:
我正在尝试改变视图模型对象的标头成员。
let mutable header : NavBarItem option = None
member x.Header with get() = header
and set(v) = header <- v
base.NotifyPropertyChanged(<@ x.Header @>)
...
//----------------------------------
// THE FOLLOWING ERRORS
//----------------------------------
member x.LoadAsync(panelId:PanelId) =
let items = seq [NavBarItem() :> UITemplate]
let result = items |> Seq.map (fun v -> v :?> NavBarItem)
|> Seq.tryHead // Error recovering value
x.Header <- result
Run Code Online (Sandbox Code Playgroud)
错误:
这是我将光标悬停在 x.Header 上后的错误:
参数数量或类型不正确 参数名称:arguments
这是我在研究错误消息后观察到的错误报告。
更新:
我尝试序列化我确实有权访问的对象序列,以便我可以反序列化 json 并访问单个项目。
这也失败了:
let temp = seq [NavBarItem() :> UITemplate] |> filterToNavBarItems
|> Seq.cast<NavBarItem>
let json = JsonConvert.SerializeObject(temp)
let items = JsonConvert.DeserializeObject<NavBarItem seq>(json)
let item = items |> Seq.tryHead
x.Header <- item // Error recovering value
Run Code Online (Sandbox Code Playgroud)
杰森:
[{"MeasureId":"some_navbar_id","Header":"Dashboard","Subheader":"Trauma Alerting","EmblemLabel":"","IsEmblemAttached":false,"EmblemBGColor":"","EmblemFGColor":""}]
Run Code Online (Sandbox Code Playgroud)
附录:
type UITemplate =
abstract member ToString : unit -> string
abstract member OrderIndex : int with get, set
type NavBarItem() =
inherit ViewModelBase()
let mutable header = ""
interface UITemplate with
member x.ToString() = "NavBarItem"
member val OrderIndex = -1 with get,set
member x.Header with get() = header
and set(v) = header <- v
base.NotifyPropertyChanged(<@ x.Header @>)
type ViewModelBase () =
let propertyChanged = Event<PropertyChangedEventHandler,PropertyChangedEventArgs>()
let getPropertyName = function
| PropertyGet(_,pi,_) -> pi.Name
| _ -> invalidOp "Expecting property getter expression"
interface INotifyPropertyChanged with
[<CLIEvent>]
member this.PropertyChanged = propertyChanged.Publish
member this.NotifyPropertyChanged propertyName =
propertyChanged.Trigger(this,PropertyChangedEventArgs(propertyName))
member this.NotifyPropertyChanged quotation =
quotation |> getPropertyName |> this.NotifyPropertyChanged
Run Code Online (Sandbox Code Playgroud)
很难回答你的问题,因为代码不能真正按原样编译。这使得很难看出错误在哪里,因为它可能与代码片段中未显示的内容相关。
我尝试通过删除尽可能多的内容来编译代码。我最终得到以下结果,但这工作正常:
type ViewModelBase() =
member x.NotifyPropertyChanged(a:Microsoft.FSharp.Quotations.Expr<'a>) = ()
type NavBarItem() =
inherit ViewModelBase()
let mutable header : NavBarItem option = None
member x.Header
with get() = header
and set(v) =
header <- v
base.NotifyPropertyChanged(<@ x.Header @>)
member x.LoadAsync(panelId:int) = async {
let result = None
x.Header <- result }
Run Code Online (Sandbox Code Playgroud)
如果您可以扩展这个最小样本以使其显示错误,那么我相信人们将能够提供帮助。