BooleanToVisibilityConverter在IsEnabled属性上无法正常工作
问题分析与解决方案
哦,这个问题我之前也碰到过!核心原因是你用错转换器类型啦😉
为什么当前代码不生效?
BooleanToVisibilityConverter的设计目的是把布尔值(bool)转换成Visibility枚举值(Visible/Collapsed/Hidden),而TimePicker的IsEnabled属性需要的是布尔值(bool),类型完全不匹配,所以转换器输出的结果无法被IsEnabled识别,自然不会生效。
正确的解决方法
根据你的需求,分两种情况处理:
情况1:单选按钮选中时,TimePicker启用
这种情况完全不需要转换器,直接绑定IsChecked属性即可——因为IsChecked本身就是bool类型,和IsEnabled的类型完美匹配:
<BooleanToVisibilityConverter x:Key="b2v" /> <RadioButton Content="Enable" IsChecked="True" Name="ExportByHour" GroupName="TimePickerToggle"/> <RadioButton Content="Hide" GroupName="TimePickerToggle"/> <materialDesign:TimePicker IsEnabled="{Binding IsChecked, ElementName=ExportByHour}" IsInvalidTextAllowed="False" Is24Hours="True"/>
另外我给两个单选按钮加了GroupName,这样它们会自动互斥,选中一个另一个就会取消选中,逻辑更合理。
情况2:单选按钮选中时,TimePicker禁用(反向逻辑)
如果需要反向的效果,你需要一个反转布尔值的转换器,自己实现一个很简单:
public class InverseBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { return value is bool boolValue ? !boolValue : value; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return value is bool boolValue ? !boolValue : value; } }
先在XAML的资源里声明这个转换器(注意替换local为你的项目命名空间):
<local:InverseBooleanConverter x:Key="InverseBoolConverter"/>
然后绑定使用:
<materialDesign:TimePicker IsEnabled="{Binding IsChecked, ElementName=ExportByHour, Converter={StaticResource InverseBoolConverter}}" IsInvalidTextAllowed="False" Is24Hours="True"/>
小提醒
绑定属性时一定要注意源类型和目标类型的匹配,每个转换器都有它特定的用途,BooleanToVisibilityConverter只适合和Visibility属性配合使用,可别再用错地方啦!
内容的提问来源于stack exchange,提问作者54566
相关产品推荐
相关产品推荐

