[WPF][Silverlight] Binding in WPF and Silverlight – (三)Binding的方向和Converter

  • 4820
  • 0
  • C#
  • 2013-07-14

上次介紹了超簡單的Binding設定方式,而這次就來好好的探討一下Binding資料流方向的差異吧。

 

上次介紹了超簡單的Binding設定方式,而這次就來好好的探討一下Binding資料流方向的差異吧。

Binding資料流方向的選項如下:

  1. Default:依照Binding的Property類別預設值決定Binding的模式,例如TextBox的Text和CheckBox的IsChecked屬性預設模式都是TwoWay。
  2. OneWay:由來源把值帶給目標,而之後來源值改變的話,目標會隨著更新。
  3. OneTime:由來源把值帶給目標,而且之後來源值改變的話也不會影響目標值。
  4. TwoWay:不管來源或是目標,只要有一方改變,另一方也會跟著更新。
  5. OneWayToSource:目標更新時,來源會隨之更新,但是來源更新時,目標並不會更新(Silverlight中不支援該方式,但是可以透過Mode=TwoWay ,UpdateSourceTrigger=Explicit來達到一樣的效果)。

每種控制項預設的UpdateSourceTrigger也不盡相同,例如TextBox的Trigger就是在LostFocus上。

但是,怎麼所有的物件都可以跟TextBox做Binding,既可以Binding一個布林值,又可以Binding到double上??因為不同的屬性,也會具備不同的Converter,例如TextBox的Text屬性,就會預設使用內建的Converter把值自動套用ToString()方法,所以來什麼幾乎就可以吃什麼;但是,畢竟不是所有的值都可以被轉成ToString()就可以達到我們要的效果啊,例如說,我們想要把背景的顏色拿來綁定的話,背景的資料型態是一個SolidColorBrush,但是我們想要用文字方塊來輸入像FFFFFFFF的色碼,那就需要做一個資料轉換才能正常的Binding了!而在Silverlight和WPF中都可以透過實作一個IValueConverter的介面做到不同格式資料的轉換,更可依照自己的需求決定轉換器是單向或是雙向的喔!


看個小範例感受一下不同Binding方向的差異吧(可以直接玩看看,TextBox的值要觸發LostFocus才會更新喔!!):

就上面提到的顏色轉換器來說,它的實作程式碼如下(只要實作好Convert和ConvertBack就行啦):

StringToSolidColorBrushConverter.cs
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
 
namespace SilverlightDataBinding
{
    public class StringToSolidColorBrushConverter : IValueConverter
    {
        #region IValueConverter Members
 
        public object Convert( object value , Type targetType , object parameter , System.Globalization.CultureInfo culture )
        {
            string colorString = value as string;
 
            if( String.IsNullOrEmpty( colorString ) )
            {
                return new SolidColorBrush( Color.FromArgb( 0 , 0 , 0 , 0 ) );
            }
 
            try
            {
                Color color = new Color();
                color.A = byte.Parse( colorString.Substring( 0 , 2 ) , NumberStyles.HexNumber );
                color.R = byte.Parse( colorString.Substring( 2 , 2 ) , NumberStyles.HexNumber );
                color.G = byte.Parse( colorString.Substring( 4 , 2 ) , NumberStyles.HexNumber );
                color.B = byte.Parse( colorString.Substring( 6 , 2 ) , NumberStyles.HexNumber );
 
                return new SolidColorBrush( color );
            }
            catch
            {
                return new SolidColorBrush( Color.FromArgb( 0 , 0 , 0 , 0 ) );
            }
        }
 
        public object ConvertBack( object value , Type targetType , object parameter , System.Globalization.CultureInfo culture )
        {
            if( value is Color )
            {
                Color color = ( Color ) value;
                return color.ToString();
            }
            else
            {
                return "FFFFFFFF";
            }
        }
 
        #endregion
    }
}

 

一併附上專案原始檔:


這次就幫各位介紹到這個地方,我們下次見!!