[英]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.