2015-11-16 7 views
1

Я написал расширение разметки для перевода строк с использованием ресурсов.Xamarin.Froms MarkupExtension, используемый в Picker.Items

[ContentProperty("Text")] 
public class TranslateExtension : IMarkupExtension 
{ 
    private readonly ILocalizationService _localizationService; 

    public string Text { get; set; } 

    public TranslateExtension() 
    { 
     _localizationService = Mvx.Resolve<ILocalizationService>(); 
    } 

    public object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (Text == null) 
      return ""; 

     return _localizationService.GetString(Text); 
    } 
} 

Это работает хорошо, если я использую его в Атрибуты XAML элементов, как:

<Label Text="{i18n:Translate DebugView}" VerticalOptions="Center" HorizontalOptions="Center" /> 

Но теперь я хочу, чтобы предоставить список строк в Picker.Items.

<Picker SelectedIndex="0" HorizontalOptions="End" VerticalOptions="Center" Title="{i18n:Translate State}"> 
    <Picker.Items> 
     <i18n:TranslateExtension Text="OnState"></i18n:TranslateExtension> 
     <i18n:TranslateExtension Text="OffState"></i18n:TranslateExtension> 
    </Picker.Items> 
</Picker> 

У меня нет работы. Только если я использую одинTranslateExtension элемент в пределах Picker.Items, это правильно показано. В противном случае он сработает («TranslateExtension» не может быть преобразован в тип «System.String»). Я пробовал много разных стилей написания элементов, но я не имел успеха. Каков правильный способ его написать?

+0

Это почти похоже на ошибку, но я не могу быть уверен. Так же, как что-то быстрое, чтобы попробовать обходной путь, переопределяет метод ToString() в работе TranslateExtension. Таким образом, ToString возвращает переведенное расширение. –

+0

Я попробую завтра. Но у меня нет надежды, потому что по умолчанию 'ToString' не использовался. Я даже попробовал неявный и явный оператор литья ^^ –

ответ

0
<Picker SelectedIndex="0" HorizontalOptions="End" VerticalOptions="Center" Title="{i18n:Translate State}"> 
    <Picker.ItemsSource> 
     <x:Array Type="{x:Type x:String}"> 
      <i18n:TranslateExtension Text="OnState"></i18n:TranslateExtension> 
      <i18n:TranslateExtension Text="OffState"></i18n:TranslateExtension> 
     </x:Array> 
    </Picker.ItemsSource> 
</Picker> 

Попробуйте

+0

, пожалуйста, добавьте больше подробностей о вашем ответе. –

+0

только обходной путь –

+0

Я сообщил об этой проблеме в Bugzilla. см. https://bugzilla.xamarin.com/show_bug.cgi?id=58155 –