我有以下场景......
<Page.Resources>
<converters:EnumToBoolean x:Key="Empty" Expected="Empty"/>
<converters:EnumToBoolean x:Key="Full" Expected="Full"/>
</Page.Resources>
.
.
.
<SomeControl IsChecked="{x:Bind ViewModel.State, Converter={StaticResource Empty}, Mode=TwoWay}"/>
<SomeControl IsChecked="{x:Bind ViewModel.State, Converter={StaticResource Full}, Mode=TwoWay}"/>
EnumToBoolean
是IValueConverter
将 ac#enum
转换为boolean
.
它使用该Expected
值来确定ViewModel.State
是真还是假。这是它的Convert
一部分,IValueConverter
它有效,没什么特别的。
但是,如果 'boolean' 值为 false ,则ConvertBack
需要返回的原始值作为结果。ViewModel.State
按预期返回“null”会导致运行时异常。
我尝试了两种方法来获得转换器功能的Original
价值ConvertBack
:
a) 添加另一个字段Original
并尝试绑定它
<converters:EnumToBoolean x:Key="Empty" Expected="Empty" Original="{x:Bind ViewModel.State, Mode=OneWay}"/>
<converters:EnumToBoolean x:Key="Full" Expected="Full" Original="{x:Bind ViewModel.State, Mode=OneWay}"/>
这会编译并运行,但会导致运行时异常;因为它试图在转换器被实例化之前绑定到转换器
b) 尝试将其作为ConverterParameter
带有嵌入式绑定的 a 传递
<SomeControl IsChecked="{x:Bind ViewModel.State, Converter={StaticResource Empty}, ConverterParameter={x:Bind ViewModel.WallPainter, Mode=OneWay}, Mode=TwoWay}"/>
<SomeControl IsChecked="{x:Bind ViewModel.State, Converter={StaticResource Full}, ConverterParameter={x:Bind ViewModel.WallPainter, Mode=OneWay}, Mode=TwoWay}"/>
这根本不编译;它因非描述性错误而失败,没有错误代码或任何点击此处或谷歌......“事件值不能跨越线边界”
有没有人建议如何让这些场景中的任何一个工作?
注意-我的临时解决方案远非理想,是制作 Original
转换器的字段 public Func<TEnum> Original { get; set; }
并将其 getter 设置 function
在后面的代码中。我不关心这个选项,因为它会破坏绑定实现策略。