как обновить единицу использования некоторых значений на многих страницах - PullRequest
0 голосов
/ 29 января 2020

У меня есть три страницы A, B, C, и на каждой из них есть метка для отображения различного значения расстояния, и значения расстояния могут быть представлены в километрах или милях. Приложение предоставляет страницу настроек для пользователя, чтобы изменить единицу расстояния глобально. Мой вопрос заключается в том, как глобально обновить пользовательский интерфейс при изменении настройки единицы расстояния?

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

Есть ли какое-нибудь элегантное решение этой проблемы?

ОБНОВЛЕНИЕ Самое важное здесь Я хочу обновить значение расстояния реактивно, когда я изменяю единицу использования (что-то вроде повторного запуска преобразователя значения без ручного назначения нового значения привязке расстояния). Например, у меня есть несколько меток {Binding Distance, Converter = {DistanceConverter}}, каждая из которых может связываться с другой переменной, но все они представляют расстояние. Когда я изменяю единицу использования в модальном представлении, все связанные с расстоянием метки должны обновлять свое значение автоматически, не обновляя страницу.

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Самый элегантный способ использования этого - использование преобразователей значений. Для этого вам нужно сохранить глобальное свойство в App.Xaml.cs или в любом другом месте по вашему выбору, чтобы оно не потеряло свое значение с помощью свойств приложения или настроек Essentials. после этого используйте приведенный ниже преобразователь:

 public class KiloMeterMileConvertor : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
       var isKiloMeter = parameter as bool;
       if(isKiloMeter){}
       else{}
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

Теперь вы можете использовать его как

SomeProperty= {Binding ABinding, Converter={StaticResource KiloMeterMileConvertor }, ConverterParameter={Static local:YourIdentifier}}

Теперь вы можете использовать это несколькими способами, чтобы вернуть текущую единицу измерения или преобразовать фактическое значение.

Если вы хотите преобразовать эти значения, они доступны непосредственно в Xamarin.Essentials

https://docs.microsoft.com/en-us/dotnet/api/xamarin.essentials.unitconverters.kilometerstomiles?view=xamarin-essentials#Xamarin_Essentials_UnitConverters_KilometersToMiles_System_Double_

https://docs.microsoft.com/en-us/dotnet/api/xamarin.essentials.unitconverters.milestokilometers?view=xamarin-essentials#Xamarin_Essentials_UnitConverters_MilesToKilometers_System_Double_

Удачи

Не стесняйтесь вернуться, если у вас есть вопросы

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

Путь к ресурсам (Поскольку вы ищете элегантный способ, продолжение ответа Чокнутого Али).

App.Xaml

    <Application.Resources>
        <x:String x:Key="milesUnit">Miles</x:String>
        <x:String x:Key="kmUnit">Km</x:String>
        <local:DistanceConverter x:Key="distanceConverter"/>
    </Application.Resources>

App.Xaml.cs

    public App()
    {
        InitializeComponent();
        Application.Current.Resources["distanceUnit"] = Application.Current.Resources["milesUnit"];
            ......
    }

Конвертер

    public class DistanceConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                string unit = Application.Current.Resources["distanceUnit"].ToString();
                double distance = double.Parse(value.ToString());
                if (unit == "Km")
                {
                    return distance * 1.60934;
                }
            }

            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    }

Page.Xaml

    <StackLayout>
        <Label Text="In Page 1"/>
        <Label Text="{Binding Distance,Converter={StaticResource distanceConverter}}"/>
        <Label Text="{DynamicResource distanceUnit}"/>
    </StackLayout>

Нажатие кнопок

    void Button_Clicked(System.Object sender, System.EventArgs e)
    {
        Application.Current.Resources["distanceUnit"] = Application.Current.Resources["milesUnit"];
    }

    void Button_Clicked_1(System.Object sender, System.EventArgs e)
    {
        Application.Current.Resources["distanceUnit"] = Application.Current.Resources["kmUnit"];
    }

Если вы собираетесь поддерживать только Мили и Км, ответ Freaky Ali хорош, но если вы планируете поддерживать другие культуры, попробуйте использовать CultureInfo .

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