首页 > 解决方案 > 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

标签: xamarin.formsf#mono

解决方案


很难回答你的问题,因为代码不能真正按原样编译。这使得很难看出错误在哪里,因为它可能与您的代码段中未显示的内容有关。

我尝试通过删除尽可能多的代码来编译代码。我最终得到了以下结果,但这很好用:

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 }

如果您可以扩展此最小示例以使其显示错误,那么我相信人们将能够提供帮助。


推荐阅读