1、 if (double.TryParse(value.ToString(), out d) if (d = 0 & d = 80) return new ValidationResult(true, null); return new ValidationResult(false,输入数字不合理!);B、XAML代码View Code TextBox x:Name=textbox1 Margin=5/TextBoxSlider x:slider1 Minimum=-10 Maximum=110/Slider/StackPanel/WindowC、cs代码CS using System.Wind
2、ows;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using CommonLib;namespace BindingOfValid / / MainWindow.xaml 的交互逻辑/summary public partial
3、class MainWindow : Window public MainWindow() InitializeComponent(); /新建绑定实例,指定源和路径 Binding binding = new Binding(Value)Source=this.slider1; /设置更新绑定源的方式 binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; /创建验证条件 RangeValidationRule rvr = new RangeValidationRule(); /默认数据源的数据都是正确的,如果加上
4、下面的验证目标更新,则也会验证源的数据是否合法 rvr.ValidatesOnTargetUpdated = true; /向ValidationRules添加验证条件 binding.ValidationRules.Add(rvr); /设置通知错误的提示,我们可以把它想象为报警器,它会沿着目标,传到安装处理报警的地方 binding.NotifyOnValidationError = true; binding.NotifyOnTargetUpdated = true; /添加对源和目标的更新的监视,设置ToolTip为空 this.TargetUpdated += new EventHa
5、ndler(MainWindow_TargetUpdated); this.SourceUpdated += new EventHandler 0) this.textbox1.ToolTip = Validation.GetErrors(this.textbox1)0.ErrorContent.ToString(); e.Handled = true;效果图如图1:图1本段代码重在理解Binding的数据校验,还有很多细节要进行优化。再总结一下实现过程:定义一个验证规则和Binding,把验证规则添加到绑定的验证规则集里面,开启Binding的报警器(NotifyOnValidationEr
6、ror),为指定的UI控件添加路由事件来做出相应的反应。1.2Binding的数据转化在XAML的语法的记录中有出现过转化(TypeConverter),主要是实现XAML标签的Attribute与对象的Property进行映射。今天要记录的是绑定的数据的转化,在这里可以把Binding比作一笔交易,买家想要某种东西,但是卖家给的却不是成型的产品,所以需要去加工才能成为买家最终想要的产品。反过来说,买家有的时间不给卖家钱,而是给的黄金或其他有价值的东西,那么如果卖家用钱的话,他要去转化成现金。同样在使用Binding时, 这样的例子也是屡见不鲜了,最明显的我们要把字符串类型的性别转化成布尔型的
7、性别然后绑定到指定的CheckBox上面或者是其他控件上面。下面举个例子来说明一下,把飞机型号转化成图片路径显示出来,并且可以安排飞机的位置,(OnAir表示在空中,OnLand表示在陆上,Unknow表示位置保密),可能我画的飞机不像,但重在说明问题。A、先定义一个飞机类:Plane.cs namespace Chapter_04 public class Plane public string Category get; set; public string Area get; public string State get;B、写两个转化类PlaneConVerter和StateOfPl
8、ane,并且都实现IValueConverter这个接口,写代码的时间可以直接在IValueConverter上面右击,实现接口,要实现的方法就能搞定了,剩余的就是一些算法。代码如下: /TypeConverter public class PlaneConVerter:IValueConverter /单向绑定 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) return Icons + value.ToString
9、() + .png public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) throw new NotImplementedException(); public class StateOfPlane : IValueConverter /双向绑定 /源向目标的转化 switch (value.ToString() case : return true; return false; default: return nu
10、ll; /目标向源的转化 bool? s = (bool?)value; switch (s) case true : return case false : case null :C、前后台代码:XAML Chapter_04.ConvertInBindinglocal=clr-namespace:Chapter_04ConvertInBinding250Window.Resourceslocal:PlaneConVerter x:Key=pcv/StateOfPlane x:sop/Window.ResourcesListBox x:listBox160ListBox.ItemTempla
11、teDataTemplateStackPanel Orientation=Horizontal Background=BeigeImage Width=2530 Source=Binding Path=Category,Converter=StaticResource pcvTextBlock Text=Binding Path=Area60CheckBox IsThreeState=True IsChecked=Binding Path=State,Converter=StaticResource sop/DataTemplate/ListBox.ItemTemplate/ListBoxBu
12、tton Content=load Click=Button_Click /SaveInfoButton_Click_1cs using System.Collections.ObjectModel;using System.IO; / ConvertInBinding.xaml 的交互逻辑 public partial class ConvertInBinding : public ConvertInBinding() private void Button_Click(object sender, RoutedEventArgs e) ObservableCollection planeL
13、ist = new ObservableCollection() new PlaneCategory=歼7B,Area=济南军区,State=,歼8F兰州军区成都军区南京军区 ; this.listBox.ItemsSource = planeList; private void Button_Click_1(object sender, RoutedEventArgs e) StringBuilder sb = new StringBuilder(); foreach (Plane p in listBox.Items) sb.AppendLine(string.Format(Categor
14、y=0,Area=1,State=2,p.Category,p.Area,p.State); File.WriteAllText(E:WPFCodeChapter_04PlaneList.txt, sb.ToString();最后实现的结果为图2:图2其中load按钮时实现装载数据,SaveInfo按钮是保存飞机安排的情况。下面解释一下上面的例子的重点代码,IValueConverter接口有两个方法,如果是实现源到目标的单向绑定的转化话,直接实现Convert(object value, Type targetType, object parameter, CultureInfo cultu
15、re)方法;如果是要实现双向绑定的转化,两个方法都要重写,所以还要实现它ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)方法。Converter是绑定的一个属性,所以在里面直接为Converter赋值显得很自然了。二、多路Binding(MultiBinding)多路Binding主要用于:一个UI需要显示的信息不止一个数据来决定,MultiBinding有一个属性为Bindings,就是用来添加Binding的。同时,多路Binding也有Converter属性。但实现的是IMu
16、ltiValueConverter接口,方法不一样的地方就是Convert(object values, Type targetType, object parameter, System.Globalization.CultureInfo culture)里面的第一个参数是复数形式,分别是Binding的源的属性值。还是通过例子来说明多路绑定的应用吧。需求是一个按钮是否可用取决于两个文本框的值是否一样。MultiBindingOfbind.MainWindow139383Vertical102TextBox Height=23 HorizontalAlignment=Left Name=textBox1 VerticalAlignment=Top350textBox2Submit IsEnabled=Falsebutton175us
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2