使用x:Bind调用带任意数量参数的XAML辅助函数可行吗?
解决XAML中x:Bind调用params辅助函数的问题
你遇到的问题根源在于x:Bind是编译时绑定,它不会自动处理C#里的params参数特性——既不会把多个传入的参数自动打包成数组,也不会把单个对象自动转换为数组类型,所以才会出现两种场景下的编译错误。
下面给你两种可行的解决办法:
方法1:添加函数重载
直接为TrueForAll添加对应参数数量的重载版本,让x:Bind能找到匹配的编译时签名:
public static class CommonHelpers { // 单个参数的重载 public static bool TrueForAll(object obj) => obj != null; // 两个参数的重载 public static bool TrueForAll(object obj1, object obj2) => obj1 != null && obj2 != null; // 保留原有的params版本,供代码里直接调用 public static bool TrueForAll(params object[] objects) => objects.All(x => x != null); }
这样在XAML里传入1个或2个参数时,x:Bind会匹配对应的重载,编译就能通过;如果需要支持更多参数,继续添加对应的重载即可。
方法2:手动构造数组传入
在XAML里用x:Array标记扩展手动创建object[]数组,再传给TrueForAll:
首先要在XAML根节点引入System命名空间:
xmlns:system="using:System"
然后修改IsEnabled的绑定:
<Button Content="Button content" Margin="0,0,10,0" Command="{Binding SomeCommand}" IsEnabled="{x:Bind helpers:CommonHelpers.TrueForAll( x:Array Type=system:Object, x:Item={x:Bind ViewModel.Property}, x:Item={x:Bind ViewModel.SomeOtherProperty} )}" VerticalAlignment="Center"> </Button>
这种方式不需要修改C#代码,直接在XAML里构造数组满足函数的参数要求。
内容的提问来源于stack exchange,提问作者Gregor Bučar
相关产品推荐
相关产品推荐

