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

今天有時間把Silverlight中OneTime,OneWay,TwoWay及INotifyPropertyChanged 接口的理解等數據綁定方面的東西理解學習了下!下面是我的筆記。

(一)前臺代碼:

<Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <StackPanel Orientation="Horizontal"   HorizontalAlignment="Center">
                <TextBlock Height="23" Name="textBlock1" Text="編號" Width="34" />
                <TextBox Text="{Binding ID,Mode=OneTime}" Name="tbxID" Width="106" Height="27" ></TextBox>
            </StackPanel>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                <TextBlock Height="23"  Name="textBlock2" Text="書名:" />
                <TextBox Text="{Binding Title,Mode=OneWay}" Name="tbxTitle" Width="108" Height="27" ></TextBox>
            </StackPanel>
            <StackPanel Orientation="Horizontal"  HorizontalAlignment="Center">
                <TextBlock Height="23"  Name="textBlock3" Text="價格:" VerticalAlignment="Top" />
                <TextBox Text="{Binding Price,Mode=TwoWay}" Name="tbxPrice" Width="108" Height="27"></TextBox>
            </StackPanel>           
            <StackPanel>
                <Button Name="MyButton" Content="通過數據源修改控件的值" Click="MyButton_Click" Width="140" Height="27"></Button>
                <Button Content="直接修改控件的值" Height="23" Name="button1" Width="139" Click="button1_Click"  />
                <Button Content="通過控件修改數據源的值" Height="23"  Name="button2"  Width="140" Click="button2_Click" />
            </StackPanel>    
        </StackPanel>
        
    </Grid>

(二)後臺代碼

 

 public partial class MainPage : UserControl
    {
        Book book = new Book();
        public MainPage()
        {
            InitializeComponent();
            book.ID = 0;
            book.Title = "ASP.NET 開發手冊";
            book.Price = 40;
            tbxID.DataContext = book;
            tbxTitle.DataContext = book;
            tbxPrice.DataContext = book;          
        }
        //通過修改數據源修改控件的值
        //如果在沒有實現INotifyPropertyChanged接口情況下,OneTime,OneWay,TwoWay三種方式都不能實現數據源更改控件值的場景
        //當實現了INotifyPropertyChanged接口情況下,OneWay,TwoWay能實現數據源更改控件值的場景,而OneTime是不能實現的
        //因爲OneTime是初始化綁定後,控件和數據源就沒關係了的
        //結論:數據源--》控件 的更改就只能用OneWay,TwoWay並且需要實現INotifyPropertyChanged接口
        private void MyButton_Click(object sender, RoutedEventArgs e)
        {
            book.ID = 100;
            book.Price = 50;
            book.Title = "SL開發手冊";            
        }        
        
        //通過控件修改數據源的值
        //因爲ID是OneTime,Title用的是OneWay無論Book是否繼承了INotifyPropertyChanged接口,都無法通過修改控件tbxID,tbxTitle的值來修改數據源的值的
        //對於Pirce使用了TwoWay方式,無論Book是否繼承了INotifyPropertyChanged接口,都可以通過修改tbxPrice的值修改數據源的值
        //因爲當目標和源有一個發生變化時,TwoWay 綁定既更新目標也更新源
        //結論:控件---》數據源,只有使用TwoWay方式纔可以修改數據源(且不需要實現INotifyPropertyChanged接口)
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(book.ID.ToString() + " " + book.Title.ToString() + " " + book.Price.ToString());
        }

        //直接修改控件的值
        //雖然這樣能更改控件Text屬性值,但要進行類型轉換,在這裏都要轉換爲字符串類型
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            tbxID.Text = "100";
            tbxPrice.Text = "50";
            tbxTitle.Text = "SL開發手冊";
        }

    }
    public class Book:INotifyPropertyChanged
    {
        private int _id;
        public int ID
        {
            get { return _id; }
            set
            {
                _id = value;
               NotifyPropertyChange("ID");
            }
        }
        private string _title;
        public string Title
        {
            get { return _title; }
            set
            { 
                _title = value;
               NotifyPropertyChange("Title");
            }
        }
        private double _price;
        public double Price
        {
            get { return _price; }
            set
            {
                _price = value;
               NotifyPropertyChange("Price");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }


 

(三)總結:

數據源--》控件 的更改就只能用OneWay,TwoWay並且需要實現INotifyPropertyChanged接口,而控件---》數據源,只有使用TwoWay方式纔可以修改數據源(且不需要實現INotifyPropertyChanged接口)。然而直接更改控件值,雖然這樣能更改控件Text屬性值,但要進行類型轉換,在這裏都要轉換爲字符串類型。所以我們在操作是常用實體來接收參數,而不是直接去控件的值!

原文來源:http://blog.csdn.net/Joetao/article/details/5803716

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章