xamarin.forms - Mono Bug:在改变对象成员后尝试观察新分配的值时出现错误消息
问题描述
在改变对象成员后尝试观察新分配的值时,我在数据提示上观察到错误消息。
视图模型:
我正在尝试改变视图模型对象的标头成员。
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
错误:
这是我将光标悬停在 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
杰森:
[{"MeasureId":"some_navbar_id","Header":"Dashboard","Subheader":"Trauma Alerting","EmblemLabel":"","IsEmblemAttached":false,"EmblemBGColor":"","EmblemFGColor":""}]
附录:
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
解决方案
很难回答你的问题,因为代码不能真正按原样编译。这使得很难看出错误在哪里,因为它可能与您的代码段中未显示的内容有关。
我尝试通过删除尽可能多的代码来编译代码。我最终得到了以下结果,但这很好用:
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 }
如果您可以扩展此最小示例以使其显示错误,那么我相信人们将能够提供帮助。
推荐阅读
- bash - sqlite dot 命令变量扩展,如 bash
- discord.js - 如何在 discord.js 中为我的不和谐音乐机器人添加均衡器?
- recursion - 您如何使用方案查找文件是否在目录树中?
- python - slice 需要 2 个参数,提供 1 个
- html - 如何安装和使用 VS Code 图标字体
- javascript - 如何将我的 Django 上下文变量放入我的 JS 文件中?
- visual-studio-code - 当用户将鼠标悬停在诊断上时,VSCode 扩展可以触发功能吗?
- javascript - 我应该在我的网站中使用哪个路径?相关路径绝对路径?
- java - Converting CIDR notation into IP range without other library
- list - 调用辅助函数来反转列表,然后在 Haskell 中压缩列表