MSND 教程短片 WPF 18(绑定)
WPF之绑定
绑定在WPF中是一个重点,也是难点。下面我们通过例子来简单讲讲绑定。
我们先画一个椭圆,用椭圆的宽来绑定Slider控件的Value。
1: <Ellipse Margin="68,51,88,0" Name="ellipse1" Stroke="Black"2: Height="53" VerticalAlignment="Top" Fill="Blue"3: Width="{Binding ElementName=slider1,Path=Value}"/>
4: <Slider Height="40" Margin="39,0,51,59" Name="slider1"5: VerticalAlignment="Bottom" Maximum="100" />
通常,每个绑定都具有四个组件:绑定目标对象、目标属性、绑定源,以及要使用的绑定源中的值的路径。这里绑定目标是ellipse1,目标属性是Width,绑定源是slider1,源属性是Value。
运行看效果:
还有双向、单项绑定等。看下图。有图有真相。
OneWay 绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。此绑定类型适用于绑定的控件为隐式只读控件的情况。例如,您可能绑定到如股票行情自动收录器这样的源,或许目标属性没有用于进行更改的控件接口(如表的数据绑定背景色)。如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。
TwoWay 绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。大多数属性都默认为 OneWay 绑定,但是一些依赖项属性(通常为用户可编辑的控件的属性,如 TextBox 的 Text 属性和 CheckBox 的 IsChecked 属性)默认为 TwoWay 绑定。确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。
OneWayToSource 与 OneWay 绑定相反;它在目标属性更改时更新源属性。一个示例方案是您只需要从 UI 重新计算源值的情况。
OneTime 绑定未在图中显示,该绑定会导致源属性初始化目标属性,但不传播后续更改。这意味着,如果数据上下文发生了更改,或者数据上下文中的对象发生了更改,则更改会反映在目标属性中。如果您使用的数据的当前状态的快照适于使用,或者这些数据是真正静态的,则适合使用此绑定类型。如果要使用源属性中的某个值初始化目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。此绑定类型实质上是 OneWay 绑定的简化形式,在源值不更改的情况下可以提供更好的性能。
请注意,若要检测源更改(适用于 OneWay 和 TwoWay 绑定),则源必须实现一种合适的属性更改通知机制(如 INotifyPropertyChanged)。有关 INotifyPropertyChanged 实现的示例,请参见如何:实现属性更改通知。
UpdateSourceTrigger的运用
下面我们来看一下绑定中的依赖属性。
首先我们,新建一个Person.cs类
1: class Person:INotifyPropertyChanged2: {3: public event PropertyChangedEventHandler PropertyChanged;4:5: private string _name;6:7: public Person(string s)8: {9: _name = s;10: }11:12: public string Name13: {14: get { return _name; }
15: set { _name = value;OnPropertyChanged("Name"); }
16: }17: void OnPropertyChanged(string property)
18: {19: if (PropertyChanged!=null)
20: {21: PropertyChanged(this,new PropertyChangedEventArgs(property));22:23: }24: }25: }
xaml是:
1: <Grid>2: <Grid.Resources>3: <ObjectDataProvider x:Key="odp"
4: ObjectType="{x:Type src:Person}">
5: <ObjectDataProvider.ConstructorParameters>6: <system:String>Hello WPF</system:String>7: </ObjectDataProvider.ConstructorParameters>8: </ObjectDataProvider>9: </Grid.Resources>10: <TextBox Height="50" Text="{Binding Source={StaticResource odp}, Path=Name}"11: HorizontalAlignment="Left" FontSize="36"12: Margin="70,42,0,0"
13: Name="textBox1"
14: VerticalAlignment="Top"
15: Width="226" />
16: <TextBox Height="50" Text="{Binding Source={StaticResource odp},17: Path=Name, UpdateSourceTrigger=PropertyChanged}"
18: HorizontalAlignment="Left" FontSize="36"19: Margin="70,96,0,0"
20: Name="textBox2"
21: VerticalAlignment="Top"
22: Width="226" />
23: </Grid>
Default
绑定目标属性的默认 UpdateSourceTrigger 值。多数依赖项属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。
LostFocus
当绑定目标元素失去焦点时,更新绑定源。
Explicit
仅在调用 UpdateSource 方法时更新绑定源。
作者:dingli
出处:http://www.cnblogs.com/dingli/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。