SilverlightはMVVMによるマルチ言語のリアルタイム切り替え(ソースコードを含む)を実現
4671 ワード
http://www.cnblogs.com/024hi/archive/2011/06/28/2091949.html
この例はMVVMLightToolkitに基づいているため、私たちのViewModelベースクラスはMVVMLightToolkitが提供するViewModelBaseから継承され、AdvancedViewModelBaseと命名されています.プロジェクト内のすべてのViewModelはこのクラスから継承されています.まず、クラス図を参照してください.
この例はMVVMLightToolkitに基づいているため、私たちのViewModelベースクラスはMVVMLightToolkitが提供するViewModelBaseから継承され、AdvancedViewModelBaseと命名され、プロジェクト内のすべてのViewModelがこのクラスから継承されます.
本稿では、「リアルタイム」切り替えに重点を置きます.ViewModelのプロパティが変更された場合、インタフェースに変更を反映するには、通知メカニズムであるINotifyPropertyChangedを使用する必要があることを知っています.そのため、次のような中間「エージェント」クラスObservableResourcesを導入しました.
public class ObservableResources : INotifyPropertyChanged { public string this[string resourceName] { get { return Language.ResourceManager.GetString(resourceName); } } public event PropertyChangedEventHandler PropertyChanged; public void UpdateBindings() { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Item[]")); } }
クラスのインデックスを使用しているので、PropertyChangedEventArgsのパラメータは「Item[]」、Languageクラスはリソースファイルとして自動的に生成されます.
その後、AdvancedViewModelBaseクラスでインスタンス化します.AdvancedViewModelBaseのキーコードは次のとおりです.
ここではインタフェースにバインドするためのICommandを用意し,ChangeLanguageCommandがアクティブ化されたときにChangeLanguageメソッド(選択した言語タイプを渡す)を実行し,LanguageResourceのUpdateBindingsメソッドを呼び出してインタフェースの現在のCultureの変更を通知する.
EdsLanguageクラスはカスタムで、Culture、アイコン、言語情報を定義します.
XAMLでは、多言語を使用する必要がある部分はこのように呼び出す必要があります.
そのうちLogin_UserName Labelは、リソースファイルのNameです.
言語タイプを変更する例(この例ではEventToCommandを使用していますが、もちろん他の方法でも可能です):
サンプルソース:http://files.cnblogs.com/024hi/SwitchLanguageDemo.zip
この例はMVVMLightToolkitに基づいているため、私たちのViewModelベースクラスはMVVMLightToolkitが提供するViewModelBaseから継承され、AdvancedViewModelBaseと命名されています.プロジェクト内のすべてのViewModelはこのクラスから継承されています.まず、クラス図を参照してください.
この例はMVVMLightToolkitに基づいているため、私たちのViewModelベースクラスはMVVMLightToolkitが提供するViewModelBaseから継承され、AdvancedViewModelBaseと命名され、プロジェクト内のすべてのViewModelがこのクラスから継承されます.
本稿では、「リアルタイム」切り替えに重点を置きます.ViewModelのプロパティが変更された場合、インタフェースに変更を反映するには、通知メカニズムであるINotifyPropertyChangedを使用する必要があることを知っています.そのため、次のような中間「エージェント」クラスObservableResourcesを導入しました.
public class ObservableResources : INotifyPropertyChanged { public string this[string resourceName] { get { return Language.ResourceManager.GetString(resourceName); } } public event PropertyChangedEventHandler PropertyChanged; public void UpdateBindings() { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Item[]")); } }
クラスのインデックスを使用しているので、PropertyChangedEventArgsのパラメータは「Item[]」、Languageクラスはリソースファイルとして自動的に生成されます.
その後、AdvancedViewModelBaseクラスでインスタンス化します.AdvancedViewModelBaseのキーコードは次のとおりです.
public ObservableResources LanguageResource { get; set; }
public ICommand ChangeLanguageCommand { get; set; }
public AdvancedViewModelBase() {
LanguageResource = new ObservableResources();
ChangeLanguageCommand = new RelayCommand<EdsLanguage>(ChangeLanguage);
}
private void ChangeLanguage(EdsLanguage lang) {
var culture = new CultureInfo(lang.CultureName);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
LanguageResource.UpdateBindings();
}
ここではインタフェースにバインドするためのICommandを用意し,ChangeLanguageCommandがアクティブ化されたときにChangeLanguageメソッド(選択した言語タイプを渡す)を実行し,LanguageResourceのUpdateBindingsメソッドを呼び出してインタフェースの現在のCultureの変更を通知する.
EdsLanguageクラスはカスタムで、Culture、アイコン、言語情報を定義します.
XAMLでは、多言語を使用する必要がある部分はこのように呼び出す必要があります.
そのうちLogin_UserName Labelは、リソースファイルのNameです.
言語タイプを変更する例(この例ではEventToCommandを使用していますが、もちろん他の方法でも可能です):
<ComboBox SelectedItem="{Binding SelectedLanguage}" ItemsSource="{Binding EdsLangList}" x:Name="cbLanguage" Width="110" Height="30" HorizontalAlignment="Left">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding ChangeLanguageCommand}" CommandParameter="{Binding ElementName=cbLanguage,Path=SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Width="28" Height="28" Source="{Binding FlagIcon}"/>
<TextBlock Text="{Binding LanguageName}" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
サンプルソース:http://files.cnblogs.com/024hi/SwitchLanguageDemo.zip