V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drymonfidelia
V2EX  ›  .NET

Avalonia 11 后要从 ItemsControl 调用母 UserControl 的命令这种常见操作就必须每次都写这么长一坨东西吗?

  •  
  •   drymonfidelia · 40 天前 · 1377 次点击
    这是一个创建于 40 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一直用老版本 Avalonia ,最近才开始给新项目上 11 。Avalonia 这个框架向下兼容一直做的挺差的,每次更新大版本号都改一些语法。特别是开始支持移动端后 breaking changes 超级多,也算可以理解。

    然后发现"{Binding $parent[ItemsControl].DataContext.ParentCommand}" 这种写法不能用了,会报错 Unable to resolve property or method of name 'ParentCommand' on type 'System.Object'。GPT-4 和 Claude 都完全不懂这个变化,一直指导我排查别的东西,折腾了好久也没解决。

    只好去 Discord 上问群友,群友说是 11 新加的 CompileBindings 导致的,默认开启,必须把 CompileBindings 关掉,或者每次调用 Parent Command 都写 Command="{Binding $parent[ItemsControl].((vm:ParentViewModel)DataContext).ParentCommand}" 这么长一大坨。(不写 .NET 的 v 友可以理解为每次从 for 循环里 call 一个循环外面的函数要写 89 个字符)从 list 调用母 vm 的 Command 可是一个非常常见的操作,本来写 $parent[ItemsControl].DataContext.ParentCommand 就已经很长很难看,现在还要再加一段。为什么就不解决一下呢?
    4 条回复    2024-11-20 21:26:21 +08:00
    beginor
        1
    beginor  
       40 天前 via Android
    关注,没用过 Ava ,准备入坑
    chenxuuu
        2
    chenxuuu  
       40 天前
    编译绑定会检查你的代码,没办法推断类型的话就编译不过去,只有两个解决方案:

    1. 把编译绑定关了,速度慢一点,一般情况下感知不到
    2. 手动加类型指定好,就是你搜到的方案
    chenxuuu
        3
    chenxuuu  
       40 天前
    另外可以针对某个 usercontrol 单独关闭编译绑定,不用改全局配置

    https://docs.avaloniaui.net/zh-Hans/docs/basics/data/data-binding/compiled-bindings
    hez2010
        4
    hez2010  
       40 天前
    因为 $parent[ItemsControl].DataContext 的类型是 object ,而 object 类型并没有叫做 ParentCommand 的成员,所以没法绑定到 ParentCommand 上去。你可以先做一次类型转换再绑定就可以了,就是你发的那个 {Binding $parent[ItemsControl].((vm:ParentViewModel)DataContext).ParentCommand}。
    推荐你打开 CompiledBindings ,可能会导致需要在 xaml 里插入一些类型 hint ,但是如果你开了 CompiledBindings 的话你的 app 就是 AOT 兼容的,可以直接编译到本机二进制代码而无需 runtime 就能运行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1488 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 16:56 · PVG 00:56 · LAX 08:56 · JFK 11:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.