打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
WPF中一个通用的BoolToXXX转换类

WPF程序的数据绑定里面,经常会通过一个布尔类型的值来控制UI控件的状态,例如是否可见,是否最大化之类的。然而UI控件的各个状态属性的类型往往不是布尔类型,比如UIElement.Visibility的类型是Visibility枚举,Window.WindowState的类型是WindowState枚举。以前我为了将布尔类型的数据绑定到这些可依赖属性的时候,经常要写很多ValueConverter,例如BoolToVisibilityConverter啦,BoolToWindowStateConverter啦,很麻烦。介绍一个通用的BoolToXXX转换类,这个类使用Binding对象的ConverterParameterFallbackValue来实现布尔类型与任意值转换的功能。

ConverterParameter是数据绑定的时候UI传到ValueConverter的参数,比如要将一个字符串通过数据绑定转换成整数,可以通过ConverterParameter来指定按照十进制还是十六进制转换。而FallbackValue的作用是,当数据绑定不能提供一个有意义的数值的时候(通过返回DependencyProperty.UnsetValue这个值),数据绑定引擎就会使用FallbackValue里面指定的值。

先看看BoolToValueConverter的源代码:

public class BoolToValueConverter : IValueConverter
{
#region IValueConverter Members

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((bool)value)
return parameter;
else
return DependencyProperty.UnsetValue;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return object.Equals(value, parameter);
}

#endregion
}

上面的Convert函数,通过判断绑定的布尔值,如果为真(True),则使用Binding对象的ConverterParameter属性保存的值,如果为假(False),那么返回DependencyProperty.UnsetValue,这样就告诉数据绑定引擎,使用Binding对象的FallbackValue。而ConvertBack的作用就是为了判断 UI对象对应属性的值(例如UIElement.Visibility)是不是和预设的值(例如Visibility.Visible)相同,而返回相应的值。你也可以通过下面的代码来获知BoolToValueConverter的用法请注意黄色加亮的部分:

BoolToValueTestWindow.xaml:
<Window x:Class="ManualTestProject.WpfLibTest.BoolToValueTestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converter="clr-namespace:WpfLib.Converters;assembly=WpfLib"
Title="BoolToValueTestWindow" Height="300" Width="300" x:Name="LayoutRoot">
<Window.Resources>
<converter:BoolToValueConverter x:Key="BoolToValueConverter" />
</Window.Resources>
<StackPanel>
<CheckBox IsChecked="{Binding ElementName=LayoutRoot, Path=BoolValue}"
Content="Check box" />
<Button Content="True"
Visibility="{Binding ElementName=LayoutRoot, Path=BoolValue, Converter={StaticResource BoolToValueConverter}, ConverterParameter=Visible, FallbackValue=Collapsed}"
x:Name="TrueButton" Click="TrueButton_Click"/>
<Button Content="False"
Visibility="{Binding ElementName=LayoutRoot, Path=BoolValue, Converter={StaticResource BoolToValueConverter}, ConverterParameter=Collapsed, FallbackValue=Visible}"
x:Name="FalseButton" Click="FalseButton_Click"/>
</StackPanel>
</Window>

BoolToValueTestWindow.xaml.cs:
public partial class BoolToValueTestWindow : Window
{
public bool BoolValue
{
get { return (bool)GetValue(BoolValueProperty); }
set { SetValue(BoolValueProperty, value); }
}

public static readonly DependencyProperty BoolValueProperty =
DependencyProperty.Register("BoolValue",
typeof(bool),
typeof(BoolToValueTestWindow),
new UIPropertyMetadata(false));

public BoolToValueTestWindow()
{
InitializeComponent();
}

private void TrueButton_Click(object sender, RoutedEventArgs e)
{
BoolValue = false;
}

private void FalseButton_Click(object sender, RoutedEventArgs e)
{
BoolValue = true;
}
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WPF E 文章汇总
用WPF自定义CheckBox的样式
[WPF疑难]在WPF中显示动态GIF
OC Json字典 字符串比较 布尔型 数值
动画
WPF环境的搭建
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服