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的欄位了!