# 绑定方向及数据更新 Path 绑定属性名称,Source 绑定数据源,绑定属性必须是依赖属性 UpdateSourceTrigger 更新源触发器 PropertyChanged LostFocus Explicit Default 可以用控件.SetBinding(控件静态属性,new Binding("Path")){Source=xxx} 如果绑定的集合类的属性仍然是集合,可以用'/',将子集集合中的元素当作Path 绑定属性可以为控件静态属性 Path=Text.Length; Source本身就代表数据,如字符串的时候,Path可以省略只留下Binding或Binding Path=.或Binding .; Binding的源类型(Source) - clr类型对象 - clr集合对象:ItemsSource - ADO.Net数据对象 DataTable DataView,DataTable.DefaultView; ListView派生与ListBox,GridView继承ViewBase,ListView.View是ViewBase类型。目前ListView.View只能用GridView。 - XmlDataProvider XML数据,TreeView Menu,XmlDataProvider.Source=new Urine(@"路径"),XPath=(要提取的节点,如/StudentList/Student);可以作为资源把xml内容放在标签内; - 依赖对象 Dependency Object 可以作为源和目标,依赖对象的依赖属性作为Path - 容器DataContext(上下文数据源,依赖属性),无法明确是从哪个源的属性获取数据时,它上层的DataContext会沿着UI树往下传递,直到找到源中有对应Path的属性后,将该DataContext作为自己的源 DataContext使用场景: a. 当UI上的多个控件使用Binding关注同一个对象时 b. 当Source对象不能被直接访问时,如Private,B窗口访问A窗口的控件时,将A窗口的控件作为数据源时,可以使用把控件作为窗口A的DataContext(public),暴露数据。 - ELementName=控件名 - RelativeSource属性相对地指定Source RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Grid},AncestorLevel=1},Path=Name} RelativeSourceMode枚举: FindAncestor查找父级,TemplatedParent,PreviousData; AncestorType父级类型,AncestorLevel层级便宜量,上一级为1,三个美剧 - ObjectDataProvider ```csharp ObjectDataProvider odp=new ObjectDataProvider() odp.ObjectInstance=new Class(); odp.MethodName="方法名" odp.MethodParameters.Add("参数值") Binding bindingToArg1=new Binding("MethodParameters[0]") { Source=odp, BindsDirectlyToSource=true, UpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged } Binding bindingToResult=new Binding("."){Source=odp} //关联 控件.SetBinding(控件静态属性,bindingToArg1) 控件.SetBinding(控件静态属性,bindingToResult) ``` - Linq检索得到的数据对象 ```csharp XDocument xdoc=XDocument.Load(); from element in xdoc.Descendants("节点名称") where element.Attribute("特性").Value.... select new Class()//转实例 { } ``` # 数据校验 ```csharp public class RangeValidationRule:ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { double d=0; if (double.TryParse(value.ToString(),out d)) { if(d>=0&&d<=100>) { return new ValidationResult(true,null); } } return new ValidationResult(false,"Validation Failed"); } } public Window(){ InitializeComponent(); Binding binding=new Binding("Value"){Source=this.slider} binding.UpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged RangeValidationRUle rvr=new RangeValidationRUle() rvr.ValidatesOnTargetUpdated=true//校验源数据 binding.ValudationRules.Add(rvr) binding.NotifyOnValidationError=true;//校验错误,发出通知 this.textBox.SetBinding(TextBox.TextProperty,binding) } void ValidationError(object sender,RoutedEventArgs e){ if(Validation.GetErrors(this.textBox).Count>0) { this.textBox.ToolTip=Validation.GetErrors(this.textBox)[0].ErrorContent.ToString() } } ``` 数据转换 ```csharp public class CategoryToSourceConverter:IValueConverter { //源=>目标(控件) public object Converter(object value,Type targetType,object parameter,CultureInfo culture) { Category c=(Category)value; switch(c) { case Category.Bomber: return @"Icon/Bomber.png"; case Category.Fighter: return @"Icon/Fighter.png"; Default: return null; } } public object ConvertBack(object value,Type targetType,object parameter,CultureInfo culture) { throw new NotImplementedException(); } } public class StateToNullableBoolConverter:IValueConverter { //源=>目标(控件) public object Converter(object value,Type targetType,object parameter,CultureInfo culture) { State s=(State)value; switch(s) { case State.Locked: return false; case State.Available: return true; default: return null; } } public object ConvertBack(object value,Type targetType,object parameter,CultureInfo culture) { bool? nb=(bool?)value switch(nb) { case false: return State.Locked; case true: return State.Available; default: return State.Unknown; } } } ``` ```xaml //绑定 ``` MultBinding使用场景一:需要通过多个对象属性综合进行判断时; Binding b1=new Binding("Text){Source=this.textBox1} Binding b1=new Binding("Text){Source=this.textBox2} MulitBinding mb=new MulitBinding(){Mode=Binding.OneWay} mb.Bindings.Add(b1)//注意绑定顺序 mb.Bindings.Add(b2) mb.Converter=LoginMultiBindingConverter() this.btn.SetBinding(Button.IsEnabledProperty,mb) public class LogoMultiBindingConverter: IMultiValueConverter { }