WPF 中转换器 --Converter使用详解(二)
1.前言
WPF转换器的作用:实现源数据和目标数据之间进行特定的转化
上一篇(文章链接:https://www.cnblogs.com/ramo/p/13476869.html)讲解了通过实现IValueConverter接口,来实现单值转换;本篇进一步讲解,通过实现IMultiValueConverter接口,来进行多值转换;
在实际的开发过程中, 有一种场景是,当多个属性值发生变化时或多个属性值满足某一条件时,引起另一属性值的变化,这种情况就适合用多值转换;当然,多值转换也可通过自己手写事件或方法进行处理,但是通过实现IMultiValueConverter接口实现,在wpf应用中做实现,会更加灵活方便。
2.WPF多值转换器实现: 通过实现IMultivalueConverter 接口的Convert 方法,将多个属性同时绑定到转换器,当多个属性同时变化时,来引起另一属性的变化;
本示例以登录为例,当用户名、密码输入框任意一个为空时,登录按钮的Enable 属性为False,当用户名、密码输入框同时有输入时,登录按钮的Enable属性为True;
后端转换类代码:
1 class LoginConverter:IMultiValueConverter 2 { 3 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 4 { 5 if (values.All(t => t != null && t.ToString() != "")) return true; 6 return false; 7 } 8 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 9 { 10 throw new NotImplementedException(); 11 } 12 }
前端绑定转换器代码:
1 <StackPanel Grid.Row="0" Grid.Column="0"> 2 <Label Width="60" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="120,80" >用户名:</Label> 3 <TextBox Name="userName" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Margin="180,-105,0,0" ></TextBox> 4 <Label Width="50" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="130,-40" >密码:</Label> 5 <TextBox Name="passWord" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Margin="180,-40,0,0" ></TextBox> 6 <Button Name="login" HorizontalAlignment="Center" VerticalAlignment="Top" Width="70" Height="30" Margin="190,20" >登录 7 <Button.IsEnabled> 8 <MultiBinding Converter="{StaticResource LoginConverter}"> 9 <Binding ElementName="userName" Path="Text"></Binding> 10 <Binding ElementName="passWord" Path="Text" ></Binding> 11 </MultiBinding> 12 </Button.IsEnabled> 13 </Button> 14 </StackPanel>
3.运行效果截图
此示例中,将userName、passWord 的Text 属性同时绑定到LoginConverter转换器,达到的效果:只有当用户名、密码均有输入的时候,登录按钮才可用;
我的敏捷宣言:快速地创建美的东西,烂代码虽然写得快,但是不容易应对更改,长久会让项目开发成本翻翻,无法维护
Clean Code:一眼读不懂的代码,耦合在一起的代码,重复的代码,要重构。好代码的感觉是意图特别清晰,读起来心旷神怡。及时重构。
Architecture:用什么技术->从0开始把应用程序框架搭起来,牢记面向对象就不会有大差池。记住设计就是:Concept-->Model(建模)。程序就是 Module(Model+架在Model上的API+特定功能的Work flow+UI)的组合。模式的目的是优化设计,享受架构之美。