2015-08-07 7 views
5

Obecnie pracuję nad projektem, w którym używam Caliburn do wiązania między View i ViewModel. Aby móc przełączać się między językami podczas wykonywania, mam oddzielne pliki zasobów zawierające wszystkie ciągi używane w aplikacji. Niektóre z, np. Textblock SMS-Wiązania są zobowiązane do jednego z zasobów łańcuchowych tak:Jak powiązać ciąg do dynamicznego zasobu za pomocą kodu w WPF

SampleView.xaml <TextBlock Text={DynamicResource Foo.Bar.Baz} ... />

Language.en-US.xaml <system:String x:Key="Foo.Bar.Baz">Im a string</system:String>

Gdy zmieniam kulturę mojej aplikacji na inny język, powiązanie z Foo.Bar.Baz powoduje, że aktualizacja łańcucha do nowego języka jest wykonywana w czasie wykonywania. Wspaniały!

Jednak niektóre właściwości tekstowych w aplikacji jest związany z ciągiem w ViewModel z Caliburn tak:

SampleView.xaml <TextBlock Text={Binding SampleText} ... />

SampleViewModel .cs public string SampleText { get; set; }

wartość SampleText jest ustawiony do zasobu ciąg z Language.en-US.xaml tak: ... SampleText = Application.Current.FindResource("Foo.Bar.Baz") as string; ...

Niestety, po zmianie kultury aplikacji ciąg znaków SampleText nie jest aktualizowany.

Pytanie brzmi zatem: Jak ustawić SampleText na zasób ciągów z Language.en-US.xaml, który automatycznie zaktualizuje się po zmianie kultury aplikacji?

UWAGA: Przez komentarzach na this StackOverflow question Czytałem, że było to możliwe dzięki bindnig tak: SampleText = Application.Current.Resource["Foo.Bar.Baz"] as string; to jednak nie dla mnie.

+1

Czy Twoja klasa SampleViewModel wdrożyć INotifyPropertyChanged? Czy ustawiasz ponownie właściwość SampleText (w kodzie) po zmianie kultury aplikacji? –

+0

Tak 'SampleViewModel' implementuje' Conductor .Collection.OneActive' od Caliburn, więc jednym ze sposobów aktualizacji 'SampleText' po zmianie kultury aplikacji jest ustawienie' SampleText = Application.Current.FindResource ("Foo.Bar.Baz"); "za każdym razem zmieniam kulturę. Jednak uważam to za złe rozwiązanie, biorąc pod uwagę, że moja aplikacja ma takie powiązania TextBlock w każdym miejscu. – Tallang

Odpowiedz

1

Możesz odwoływać się do zasobu jako DynamicResource. Aby to zrobić w kodzie za:

frameworkElement.SetResourceReference(dependencyProperty, resourceKey); 

Na przykład:

mySampleTextBlock.SetResourceReference(TextProperty, "Foo.Bar.Baz") 
Powiązane problemy