上次介紹了超簡單的Binding設定方式,而這次就來好好的探討一下Binding資料流方向的差異吧。
上次介紹了超簡單的Binding設定方式,而這次就來好好的探討一下Binding資料流方向的差異吧。
Binding資料流方向的選項如下:
- Default:依照Binding的Property類別預設值決定Binding的模式,例如TextBox的Text和CheckBox的IsChecked屬性預設模式都是TwoWay。
- OneWay:由來源把值帶給目標,而之後來源值改變的話,目標會隨著更新。
- OneTime:由來源把值帶給目標,而且之後來源值改變的話也不會影響目標值。
- TwoWay:不管來源或是目標,只要有一方改變,另一方也會跟著更新。
- 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就行啦):
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
}
}
一併附上專案原始檔:
這次就幫各位介紹到這個地方,我們下次見!!