MvvmCross: ресурс строки привязки макета Android - PullRequest
0 голосов
/ 11 сентября 2018

Возможно ли это?:

//...
local:MvxBind="Text Format('{0} {1}', Stock, @string/in_stock)"/>
//...

Я хочу создать текстовое значение, используя мое свойство из ViewModel и строковый ресурс из strings.xml , но приведенный выше пример не работает.

1 Ответ

0 голосов
/ 11 сентября 2018

AFAIK невозможно напрямую привязать к строке Android.

Работая с Xamarin и Mvx, вы должны использовать resx файлы для поддержки интернационализации (i18n).

Вы можете легко получить доступ к файлу resx из привязки, используя индексатор на вашей ViewModel:

public abstract class BaseViewModel : MvxViewModel
{
    public string this[string key] => Strings.ResourceManager.GetString(key);
}

Тогда в вашем View вы можете использовать его как:

local:MvxBind="Text Format('{0} {1}', Stock, [InStock])"


Существует еще один способ связать строки в файлах resx, использующий плагин ResxLocalization , и хотя он не поддерживает Format, но вы можете обойти его (вы можете проверить эту проблему Запрос функции: объедините MvxLang с форматом , чтобы отслеживать это)

Обычно вы создаете файл Strings.resx в своем проекте PCL / NetStandard / Shared и регистрируете его:

Mvx.RegisterSingleton(new MvxResxTextProvider(Strings.ResourceManager));

Затем в вашей базовой модели представления вам необходимо реализовать это свойство, чтобы ваши виды и модели представления имели доступ к i18n:

public IMvxLanguageBinder TextSource => new MvxLanguageBinder("", GetType().Name);

Наконец, на ваш взгляд, вы можете позвонить, используя:

local:MvxLang="Text InStock"

Обратите внимание, что он использует MvxLang вместо MvxBind. Кстати, вы можете использовать оба из них, но если вы используете Text в MvxLang, то не используйте его в MvxBind, потому что возникнут проблемы.

Наконец, вы можете объединить плагин с индексатором, чтобы уменьшить связь между файлами ViewModel и resx и обойти поддержку Format в привязке, как показано ниже (взято из упомянутой выше проблемы):

public abstract class BaseViewModel : MvxViewModel
{
    private IMvxTextProvider _textProvider;
    public BaseViewModel(IMvxTextProvider textProvider)
    {
        _textProvider = textProvider;
    }

    public string this[string key] => _textProvider.GetText("", "", key);
}

и по вашему мнению (из-за Format мы не можем использовать MvxLang здесь):

local:MvxBind="Text Format('{0} {1}', Stock, [InStock])"

Е.И.В.

...