分享

Silverlight中OneTime,OneWay,TwoWay及INotifyPropertyChanged 接口的理解

 贾朋亮博客 2012-03-09

(一)前台代码:

  1. <Grid x:Name="LayoutRoot" Background="White">  
  2.         <StackPanel>  
  3.             <StackPanel Orientation="Horizontal"   HorizontalAlignment="Center">  
  4.                 <TextBlock Height="23" Name="textBlock1" Text="编号" Width="34" />  
  5.                 <TextBox Text="{Binding ID,Mode=OneTime}" Name="tbxID" Width="106" Height="27" ></TextBox>  
  6.             </StackPanel>  
  7.             <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">  
  8.                 <TextBlock Height="23"  Name="textBlock2" Text="书名:" />  
  9.                 <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>  

 

(二)后台代码

  1. public partial class MainPage : UserControl  
  2.    {  
  3.        Book book = new Book();  
  4.        public MainPage()  
  5.        {  
  6.            InitializeComponent();  
  7.            book.ID = 0;  
  8.            book.Title = "ASP.NET 开发手册";  
  9.            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(thisnew PropertyChangedEventArgs(propertyName));  
  84.            }  
  85.        }  
  86.    }  

 

(三)总结:

         数据源--》控件 的更改就只能用OneWay,TwoWay并且需要实现INotifyPropertyChanged接口,而控件---》数据源,只有使用TwoWay方式才可以修改数据源(且不需要实现INotifyPropertyChanged接口)。然而直接更改控件值,虽然这样能更改控件Text属性值,但要进行类型转换,在这里都要转换为字符串类型。所以我们在操作是常用实体来接收参数,而不是直接去控件的值!

 

全文转自:http://blog.csdn.net/Joetao/archive/2010/08/11/5803716.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多