UWP绑定中如何设置ConverterParameter,无x:Static时如何实现
UWP 传入枚举值作为ConverterParameter的实现方案
你尝试的两种写法均不可行,核心原因是UWP中ConverterParameter不是依赖属性,无法接受任何绑定表达式(包括x:Bind和Binding)赋值,同时语法上不允许嵌套使用x:Bind,可采用以下三种方案实现需求:
方案1:将枚举值声明为静态资源引用
这是最常用的轻量化实现方案,步骤如下:
- 先在页面头部声明枚举对应的命名空间:
xmlns:enums="using:你的项目中TextControlState枚举所在的命名空间"
- 在页面资源(或全局App资源)中定义对应枚举值的静态资源:
<Page.Resources> <enums:TextControlState x:Key="ControlState_Controls">Controls</enums:TextControlState> <!-- 其他需要用到的枚举值也可以按这个格式提前声明 --> </Page.Resources>
- 绑定中直接引用该静态资源作为参数即可:
Visibility="{x:Bind vm.ControlState, Mode=OneWay, Converter={StaticResource enumToVisibilityConverter}, ConverterParameter={StaticResource ControlState_Controls}}"
方案2:使用x:Bind函数绑定省略转换器
UWP的x:Bind原生支持调用方法,完全可以替代转换器逻辑,不需要额外传参数:
- 在ViewModel或者页面后台代码中定义转换方法:
// 示例写在ViewModel中 public Visibility GetControlVisibility(TextControlState currentState) { return currentState == TextControlState.Controls ? Visibility.Visible : Visibility.Collapsed; }
- 绑定直接调用该方法即可,无需声明转换器和参数:
Visibility="{x:Bind vm.GetControlVisibility(vm.ControlState), Mode=OneWay}"
方案3:自定义标记扩展实现类x:Static效果
如果项目中多处需要用到枚举值作为静态参数,可以自定义标记扩展一劳永逸:
- 实现自定义枚举静态标记扩展:
[MarkupExtensionReturnType(ReturnType = typeof(object))] public class EnumStaticExtension : MarkupExtension { public Type Type { get; set; } public string Member { get; set; } protected override object ProvideValue() { return Enum.Parse(Type, Member); } }
- 在页面中声明标记扩展的命名空间后直接使用:
Visibility="{x:Bind vm.ControlState, Mode=OneWay, Converter={StaticResource enumToVisibilityConverter}, ConverterParameter={local:EnumStatic Type={x:Type enums:TextControlState}, Member=Controls}}"
内容的提问来源于stack exchange,提问作者DevSharma
相关产品推荐
相关产品推荐

