Какой самый простой способ привязать плавающий элемент к тексту метки в формах Xamarin? - PullRequest
0 голосов
/ 12 марта 2019

Я знаком с MVVM и привязками данных в формах Xamarin. Однако в настоящее время в моем приложении у меня есть несколько значений с плавающей точкой в ​​моей ViewModel, которые мне нужно привязать к тексту метки в XAML.

Какие-нибудь решения для этого? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 12 марта 2019

Это может работать:

Label Text="{Binding YourFloatValue, StringFormat='{0:D2}'}" />

Или в коде позади:

Label.Text = YourFloatValue.ToString();
1 голос
/ 12 марта 2019

В вашем вопросе вы упомянули две вещи: привязку float к свойству Text метки и привязку «нескольких значений float» к тексту метки.

Вы можете легко привязать поплавок к ярлыку с помощью:

<Label Text="{Binding YourFloatProperty}" />

Или с помощью StringFormat:

<Label Text="{Binding YourFloatProperty, StringFormat='This is the value: {0:D2}'}" />

Если вы хотите привязать несколько поплавков к тексту метки, в настоящее время нет способа сделать это с помощью стандартных форм Xamarin. Он указан как расширение на GitHub , поэтому он может появиться в более позднем выпуске.

У вас есть несколько вариантов.

  1. Создайте строковое свойство в вашей ViewModel, которое объединяет поплавки и связывает его с текстом метки
  2. В WPF есть multibinding , что позволяет это делать. Вы можете использовать этот этот GitHub Gist , чтобы добавить свой собственный элемент управления несколькими привязками в свой проект Xamarin Forms.

Пример для # 1:

string FloatText { get => $"This is the first float: {_float1} and here is the second{_float2}"; }

Я бы порекомендовал вариант 1.

0 голосов
/ 14 марта 2019

Самый простой способ - обернуть строковое свойство в viewmodel и установить значение, используя метод String.Format().

Я написал простую демонстрацию, чтобы объяснить это. Предположим, что в вашей модели представления есть 2 значения с плавающей точкой: float1 и float2, Вы можете добавить строковое свойство OutputString и установить его значение с помощью: this.OutputString = String.Format("Value1 is {0}; Value2 is {1}", Value1, Value2);

А затем привяжите текст метки к OutputString

Полный код выглядит следующим образом:

MyViewModel.cs

class MyViewModel : INotifyPropertyChanged
    {
        float value1;
        float value2;
        string outputString;

        public event PropertyChangedEventHandler PropertyChanged;

        public MyViewModel()
        {
            this.Value1 = 1.1f;
            this.Value2 = 1.2f;
            this.OutputString = String.Format("Value1 is {0}; Value2 is {1}", Value1, Value2);
        }

        public float Value1
        {
            set
            {
                if (value1 != value)
                {
                    value1 = value;

                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Value1"));
                    }
                }
            }
            get
            {
                return value1;
            }
        }

        public float Value2
        {
            set
            {
                if (value2 != value)
                {
                    value2 = value;

                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Value2"));
                    }
                }
            }
            get
            {
                return value2;
            }
        }

        public string OutputString
        {
            set
            {
                if (outputString != value)
                {
                    outputString = value;

                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("OutputString"));
                    }
                }
            }
            get
            {
                return outputString;
            }
        }
    }

MainPage.xaml:

<ContentPage.BindingContext>
        <local:MyViewModel/>
    </ContentPage.BindingContext>

    <StackLayout>
        <!-- Place new controls here -->
        <Label Text="{Binding OutputString}" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" />
    </StackLayout>
...