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

115 天前
 drymonfidelia
一直用老版本 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 就已经很长很难看,现在还要再加一段。为什么就不解决一下呢?
1803 次点击
所在节点    .NET
4 条回复
beginor
114 天前
关注,没用过 Ava ,准备入坑
chenxuuu
114 天前
编译绑定会检查你的代码,没办法推断类型的话就编译不过去,只有两个解决方案:

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

https://docs.avaloniaui.net/zh-Hans/docs/basics/data/data-binding/compiled-bindings
hez2010
114 天前
因为 $parent[ItemsControl].DataContext 的类型是 object ,而 object 类型并没有叫做 ParentCommand 的成员,所以没法绑定到 ParentCommand 上去。你可以先做一次类型转换再绑定就可以了,就是你发的那个 {Binding $parent[ItemsControl].((vm:ParentViewModel)DataContext).ParentCommand}。
推荐你打开 CompiledBindings ,可能会导致需要在 xaml 里插入一些类型 hint ,但是如果你开了 CompiledBindings 的话你的 app 就是 AOT 兼容的,可以直接编译到本机二进制代码而无需 runtime 就能运行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1091008

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX