Silverlight中OneTime,OneWay,TwoWay及INotifyPropertyChanged 接口的理解 .
今天有时间把Silverlight中OneTime,OneWay,TwoWay及INotifyPropertyChanged 接口的理解等数据绑定方面的东西理解学习了下!下面是我的笔记。
(一)前台代码:
01.<Grid x:Name="LayoutRoot" Background="White">
02. <StackPanel>
03. <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
04. <TextBlock Height="23" Name="textBlock1" Text="编号" Width="34" />
05. <TextBox Text="{Binding ID,Mode=OneTime}" Name="tbxID" Width="106" Height="27" ></TextBox>
06. </StackPanel>
07. <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
08. <TextBlock Height="23" Name="textBlock2" Text="书名:" />
09. <TextBox Text="{Binding Title,Mode=OneWay}" Name="tbxTitle" Width="108" Height="27" ></TextBox>
10. </StackPanel>
11. <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
12. <TextBlock Height="23" Name="textBlock3" Text="价格:" VerticalAlignment="Top" />
13. <TextBox Text="{Binding Price,Mode=TwoWay}" Name="tbxPrice" Width="108" Height="27"></TextBox>
14. </StackPanel>
15. <StackPanel>
16. <Button Name="MyButton" Content="通过数据源修改控件的值" Click="MyButton_Click" Width="140" Height="27"></Button>
17. <Button Content="直接修改控件的值" Height="23" Name="button1" Width="139" Click="button1_Click" />
18. <Button Content="通过控件修改数据源的值" Height="23" Name="button2" Width="140" Click="button2_Click" />
19. </StackPanel>
20. </StackPanel>
21.
22. </Grid>
(二)后台代码
01.public partial class MainPage : UserControl
02. {
03. Book book = new Book();
04. public MainPage()
05. {
06. InitializeComponent();
07. book.ID = 0;
08. book.Title = "ASP.NET 开发手册";
09. book.Price = 40;
10. tbxID.DataContext = book;
11. tbxTitle.DataContext = book;
12. tbxPrice.DataContext = book;
13. }
14. //通过修改数据源修改控件的值
15. //如果在没有实现INotifyPropertyChanged接口情况下,OneTime,OneWay,TwoWay三种方式都不能实现数据源更改控件值的场景
16. //当实现了INotifyPropertyChanged接口情况下,OneWay,TwoWay能实现数据源更改控件值的场景,而OneTime是不能实现的
17. //因为OneTime是初始化绑定后,控件和数据源就没关系了的
18. //结论:数据源--》控件 的更改就只能用OneWay,TwoWay并且需要实现INotifyPropertyChanged接口
19. private void MyButton_Click(object sender, RoutedEventArgs e)
20. {
21. book.ID = 100;
22. book.Price = 50;
23. book.Title = "SL开发手册";
24. }
25.
26. //通过控件修改数据源的值
27. //因为ID是OneTime,Title用的是OneWay无论Book是否继承了INotifyPropertyChanged接口,都无法通过修改控件tbxID,tbxTitle的值来修改数据源的值的
28. //对于Pirce使用了TwoWay方式,无论Book是否继承了INotifyPropertyChanged接口,都可以通过修改tbxPrice的值修改数据源的值
29. //因为当目标和源有一个发生变化时,TwoWay 绑定既更新目标也更新源
30. //结论:控件---》数据源,只有使用TwoWay方式才可以修改数据源(且不需要实现INotifyPropertyChanged接口)
31. private void button2_Click(object sender, RoutedEventArgs e)
32. {
33. MessageBox.Show(book.ID.ToString() + " " + book.Title.ToString() + " " + book.Price.ToString());
34. }
35.
36. //直接修改控件的值
37. //虽然这样能更改控件Text属性值,但要进行类型转换,在这里都要转换为字符串类型
38. private void button1_Click(object sender, RoutedEventArgs e)
39. {
40. tbxID.Text = "100";
41. tbxPrice.Text = "50";
42. tbxTitle.Text = "SL开发手册";
43. }
44.
45. }
46. public class Book:INotifyPropertyChanged
47. {
48. private int _id;
49. public int ID
50. {
51. get { return _id; }
52. set
53. {
54. _id = value;
55. NotifyPropertyChange("ID");
56. }
57. }
58. private string _title;
59. public string Title
60. {
61. get { return _title; }
62. set
63. {
64. _title = value;
65. NotifyPropertyChange("Title");
66. }
67. }
68. private double _price;
69. public double Price
70. {
71. get { return _price; }
72. set
73. {
74. _price = value;
75. NotifyPropertyChange("Price");
76. }
77. }
78. public event PropertyChangedEventHandler PropertyChanged;
79. private void NotifyPropertyChange(string propertyName)
80. {
81. if (PropertyChanged != null)
82. {
83. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
84. }
85. }
86. }
(三)总结:
数据源--》控件 的更改就只能用OneWay,TwoWay并且需要实现INotifyPropertyChanged接口,而控件---》数据源,只有使用TwoWay方式才可以修改数据源(且不需要实现INotifyPropertyChanged接口)。然而直接更改控件值,虽然这样能更改控件Text属性值,但要进行类型转换,在这里都要转换为字符串类型。所以我们在操作是常用实体来接收参数,而不是直接去控件的值!