Используйте текстовую строку в качестве параметра привязки в Xamarin Value Convertor - PullRequest
1 голос
/ 07 января 2020

Я часто использую IValueConverters в своих проектах Xamarin. Я хотел бы использовать любую произвольную строку текста в качестве параметра привязки, а не привязывать к свойству в моем View или ViewModel. Часто мне приходится создавать то, что я вижу как произвольные / лишние свойства в моей модели представления, просто для поддержки желаемой функциональности, которая загромождает мой код. В этом случае используется конвертер для получения переведенной строки из пользовательского файла XML. (В моем проекте я не могу использовать стандартный подход к файлу resx i18n - мне нужно пройти по файлу XML, чтобы найти нужную мне строку).

Я хотел бы сделать это в Xaml:

<Label Text="{Binding 'my-awesome-string-of-text',
 Converter={StaticResource ConvertMyStringToSomethingElseConvertor}}"/>

и чтобы строка 'my-awesome-string-of-text' прошла через параметр объекта IValueConvertor (в этом примере ConvertMyStringToSomethingElseConvertor).

Но я вынужден сделать вместо этого

<Label Text="{Binding MyUneccessaryStringProperty,
 Converter={StaticResource ConvertMyStringToSomethingElseConvertor}}"/>

и на моей модели представления (легкий синтаксис mvvm) необходимо сохранить свойство

private string _myUneccessaryStringProperty 
public string MyUneccessaryStringProperty 
        {
            get => _myUneccessaryStringProperty ;
            set => SetProperty(ref _myUneccessaryStringProperty , value);
        }

Можно ли выполнить то, что я хочу? Для страницы с множеством различных переводимых строк ViewModel быстро загромождается.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Я нашел приемлемый ответ, относящийся к предложению Эндрю в комментариях.

По сути, я создаю класс stati c, называемый translations, и задаю свойства stati c для значений переводов в пути. мое приложение получает их.

namespace MyApp.Utilities
{

    private static string _myAwesomeString;

    public static string MyAwesomeString

    {
        get
        {
            if (string.IsNullOrEmpty(_myAwesomeString))
            {
                MyAwesomeString= GetTranslation("MyAwesomeResource");
            }
            return _myAwesomeString;
        }
        private set => _myAwesomeString = value;
    }
}

И затем ссылка в xaml выглядит так:

<Label Text="{x:Static utils:Translations.MyAwesomeString}"></Label>

Использование методов доступа get / set гарантирует, что вызов GetTranslation будет выполняться только один раз, эффективно давая мне эффективный в памяти словарный доступ к ресурсам, которые используются на нескольких экранах.

Мне все еще нужно иметь свойства в классе, что не идеально, но, по крайней мере, так они все находятся в одном месте и не загромождать модели. Если кто-нибудь знает решение, в котором мне не нужно сохранять фактические свойства, пожалуйста, дайте мне знать!

0 голосов
/ 07 января 2020

Это можно сделать, но не совсем так. Вам нужно иметь префикс пространства имен, который в конечном итоге будет делать то же самое, что и конвертер. Посмотрите на плагин. Многоязычный на github. Конечно, нет привязки. Связывание предназначено для связывания, а не для произвольного выполнения произвольного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...