簡體   English   中英

使用XAML中的枚舉字典和字符串中的值進行本地化

[英]Localize with values from Dictionary of enums and strings in XAML

我正在嘗試將當前的文化與Xamarin Forms XAML詞典中設置的正確枚舉進行數據綁定。

我從服務器中獲得了一個事件列表,這些事件包含包含Dictionary屬性的字典,這些屬性將根據設置的Culture用來顯示正確的語言。

public class Event 
{
  // Having problem binding with the right CultureInfo í the Dictionary
  public Dictionary<Language, string> Title { get; set; }
}

// Types of languages that I could use to pick the right language string
public enum Language
{
    English = 0,
    German
}

// Just a basic view-model
public class EventsViewModel 
{
   public EventsViewModel()
   {
   }

    //James Montemagno´s MVVM Helper https://github.com/jamesmontemagno/mvvm-helpers
    public ObservableRangeCollection<Event> Events { get; } = new ObservableRangeCollection<Event>();
}

//僅是基本的Content頁面公共部分類EventsPage:ContentPage {public EventsPage(){InitializeComponent(); BindingContext =新的EventsViewModel(Navigation); }}

現在我只需要XAML即可根據枚舉/區域性在字典中綁定正確的值 ...

我嘗試通過使用Converter並檢查CultureInfo並選擇正確的值執行“半手動”操作, 但是由於某些原因,我無法啟動Converter。

我也嘗試將IValueConverter和IMarkupExtension混合使用,但效果不佳。

好的,我發現了我一直試圖使用的Converter方法缺少的東西。 我缺少ConvertParameter ,這就是Convert方法沒有觸發的原因。

所以我做了。

1。

我將此行放入App.xaml,以便可以從任何地方訪問它

 <converters:LanguageDictionaryEnumConverter x:Key="LanguageConverter" />

2。

然后,我將其放入頁面中。 我根本不使用該參數。 但是如果可以通過我的設置區域性對象,我會這樣做

<Label Text="{Binding Title,Converter={StaticResource LanguageConverter},ConverterParameter={x:Static dataObjects:Language.English}}" />

3。

然后,我實現了一個粗略的字典語言枚舉轉換器/選擇器,它選擇正確的語言字符串發送回頁面。

    public class LanguageDictionaryEnumConverter : IMarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var dic = (Dictionary<Language, string>)value;

        var cultInMySettings= Settings.Current.GetCultureInfoOrDefault;
        switch (cultInMySettings.Name)
        {
            case "de-DE":
                return dic[Language.German];
            case "en-US":
                return dic[Language.English];
            default:
                return dic[Language.English]; 
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

但是,如果您有更好的方法可以通過其他方法將值直接綁定到XAML,我想聽聽一下,並且會選擇該答案而不是這個答案,以確保其更優雅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM