Silverlight的DataGrid即時變動多國語系
現在的網頁常常會需要多國語言,剛好我在做的專案也需要用到,而且還要即時改變! 
前一篇寫過DataGrid的Header如何顯示資源檔的文字, 
但是卻只有在畫面載入的時候會變動,無法即時改變! 
想要即時改變,就想到是否可以用Binding的方法,不過很可惜, 
DataGridTextColumn的Header只吃文字,你給他其他物件, 
也只會顯示Class.ToString()的值而已, 
所以我們要擴充功能,我定義一個類別,繼承自DataGridTextColumn, 
且註冊一個新的DependencyProperty,程式碼如下:
public class MyTextColumn : DataGridTextColumn{
    public static readonly DependencyProperty LocalizationHeaderProperty = 
        DependencyProperty.Register(
        "LocalizationHeader",
        typeof(string),
        typeof(MyTextColumn),
        new PropertyMetadata(null, new PropertyChangedCallback(LocalizationHeaderCallback)));
    public string LocalizationHeader {
        get { return (string)GetValue(LocalizationHeaderProperty); }
        set { SetValue(LocalizationHeaderProperty, value); }
    }
    private static void LocalizationHeaderCallback(object sender, DependencyPropertyChangedEventArgs e) {
        MyTextColumn mtc = sender as MyTextColumn;
        mtc.Header = e.NewValue;
    }
}關於如何註冊DependencyProperty這裡就不多說。 
最重要的就是在收到LocalizationHeader的時候要去改變Header的值。 
接著為了讓xaml也可以用到資源檔,方法請看HOW TO:將 XAML 內容設定成可當地語系化。 
程式碼如下:
public class LanguageResource {
    private static Localization _Localization = new Localization();
    public Localization Localization { get { return _Localization; } }
}如此我們就可以在XAML裡面直接設定LocalizationHeader
<local:MyTextColumn LocalizationHeader="{Binding Localization.Name,Source={StaticResource LResource}}"></local:MyTextColumn>最後要讓他可以即時改變,那麼就需要INotifyPropertyChanged, 
我們修改LanguageResource如下:
public class LanguageResource : INotifyPropertyChanged{
    private static Localization _Localization = new Localization();
    public Localization Localization { get { return _Localization; } }
    public void ChangeCulture(string culture) {
        Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture);
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Localization"));
    }
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}除了繼承INotifyPropertyChanged介面之外,在多加一個改變文化的函式, 
呼叫此函式,設定好文化之後,就會通知所有用到Localization的欄位了!