![](/img/trans.png)
[英]How to using DynamicResourceExtension and IValueConverter for set color at run-time?
[英]Run-time culture change and IValueConverter in a binding
我正在處理的應用程序可以選擇切換界面語言。 這樣可以成功更改大多數UI本身,例如,使用
<Run Text="{Binding Resources.CreditsTitle, Source={x:Static models:ResourceService.Current}, Mode=OneWay}" />
除了靜態UI元素外,還有一些顯示一些模型的屬性。 對於它們中的大多數,無需本地化,僅需一個(目前)。 這些模型來自解決方案中的另一個項目,並且是只讀的。 需要以本地化形式顯示的一個屬性由模型中的ID表示,我為此編寫了一個轉換器,該轉換器返回Resource字符串。
public class RankIDToRankNameConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is int)
{
var ID = (int)value;
switch (ID)
{
case 1:
return Resources.Rank_Expert;
case 2:
return Resources.Rank_Intermediate;
等等。
在XAML文檔中,其綁定為
<Run Text="{Binding Model.RankID, Converter={StaticResource RankIDToRankNameConverterKey}, Mode=OneWay}"
Style="{DynamicResource PickupTextElementStyleKey}"
FontSize="14" />
…並且有效,但是只有一次,當第一次繪制UI元素時(顯然,當RankID屬性更改時,它也適用,但是這種情況很少發生)。 文化改變時它不會改變。 我猜這是因為屬性更改事件不會觸發,因此WPF認為沒有理由對其進行更新。
在文化改變時進行更新的“正確”方法是什么?
我已經通過向基礎模型添加新方法解決了此問題。 由於我使用的是Livet並且模型是NotificationObject的后代,因此我向有問題的模型添加了新的公共方法Update()
this.RaisePropertyChanged("changed_property_name_here");
並添加
try
{
InstanceOfModelStorage.UnderlyingModel.Update();
}
catch (NullReferenceException e) { }
給文化變革管理者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.