Привязка текста метки к переменной в формах Xamarin c # - PullRequest
0 голосов
/ 28 октября 2019

Итак, я пытаюсь создать простое приложение, например, приложение для покупок. поэтому у меня есть категории и несколько элементов для каждой категории, и когда вы сможете выбрать элемент, у вас будет возможность увеличить его количество или удалить элемент. Например, я выбрал три элемента, поэтому в моей корзине есть 3 элемента, в каждом из которых есть кнопка «Добавить» и кнопка «Удалить». Когда я нажимаю кнопку «Добавить», количество отображаемых элементов должно увеличиваться и т. Д.

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

Теперь каждый раз, когда я выбираю элемент, он добавляется в корзину и показывается на нижней странице. с кнопками + и - и т. д.

, поэтому я создал класс категории для десериализации моего json и класс objets для десериализации json моего Предмета. Я реализовал INotifyChangedProperty в классе objets, чтобы я мог продолжать показывать каждый раз, когда число выбранного элемента увеличивается, так что в основном это моя ViewModel, но я предполагаю, что мне нужен ViewModel для каждого созданного элемента? так что я думаю, что мне действительно нужно использовать ObservableCollection ..

Я надеюсь, что я все хорошо объяснил, и жду ваших отзывов о том, правильно ли я делаю или нет, и как мне поступить, чтобы получить то, что я хочу,большое спасибо

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

проблема в том, что для установки привязки контекста для моего класса "Objets" я должен поместить в него аргументы, а затем моя метка получит точное значение ... что мне делать?

Я делаю один пример по вашей модели, вы можете посмотреть:

<ContentPage.Content>
    <StackLayout>
        <Label x:Name="label1" />

        <Button
            x:Name="btn1"
            Clicked="Btn1_Clicked"
            Text="change value" />
    </StackLayout>
</ContentPage.Content>


public partial class Page15 : ContentPage
{
    public Objets model { get; set; }
    public Page15()
    {
        InitializeComponent();
        model= new Objets("test 1", 1.001f, " test11111", 12);
        this.BindingContext = model;
        label1.SetBinding(Label.TextProperty, "nbr_objet");
    }

    private void Btn1_Clicked(object sender, EventArgs e)
    {
        model.nbr_objet = 20;
    }
}
public class Objets : INotifyPropertyChanged
{
    public string Designation { get; set; }
    public float Prix { get; set; }
    public string imageUrl { get; set; }
    private int Nbr_Objet;

    public int nbr_objet
    {
        get { return Nbr_Objet; }
        set
        {
            Nbr_Objet = value;
            RaisePropertyChanged("nbr_objet");
        }
    }



    public Objets(string Designation, float Prix, string imageUrl, int Nbr_Objet)
    {
        this.Designation = Designation;
        this.Prix = Prix;
        this.imageUrl = imageUrl;
        this.Nbr_Objet = Nbr_Objet;
    }

    public event PropertyChangedEventHandler PropertyChanged;


    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Обновление:

но я думаю, что этоМне нужен ViewModel для каждого созданного элемента? поэтому я думаю, что мне действительно нужно использовать ObservableCollection.

Вы сказали, что у вас есть три категории, и у каждой категории есть много элементов. Если вы отобразите их в ListView, категория будет использоваться в качестве группызаголовок, и я предлагаю вам использовать одну и ту же модель для разных элементов для разных категорий, а затем добавить в Observablecollection, поскольку в ней реализован интерфейс INotifyPropertyChanged.

О группе ListView вы можете посмотреть:

https://github.com/xamarin/xamarin-forms-samples/tree/master/UserInterface/ListView/Grouping

Если у вас все еще есть другой вопрос, я предлагаю вам создать новую тему, чтобы задать ее, потому что эта тема очень длинная.

Пожалуйста, не забудьте пометить полезный ответ как ответСпасибо.

0 голосов
/ 29 октября 2019

Это руководство, которое может помочь с вашей проблемой. Ваш код запутан, и я думаю, что это приводит к вашей путанице (у вас есть несколько вещей, названных очень схожими). ​​

int Nbr_Objet;

public int nbr_objet { get{...} set {...}}

this.Nbr_Objet= Nbr_Objet;

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

Я бы предложил вам определить привязку в XAML и убедиться, что вы привязываетесь ксвойство nbr_objet, а не закрытая переменная-член (поле) Nbr_Objet. Если вы хотите избежать путаницы, следуйте стандарту кодирования C # и назовите вашу переменную-член _nbrObjet, а в случае верблюда ваше имя свойства public int NbrObjet { get {....

0 голосов
/ 28 октября 2019

для программной установки привязки

// set the BindingContext for the page
this.BindingContext = new MyViewModel();

// Title is a public property on MyViewModel
myLabel.SetBinding(Label.TextProperty, "Title");

, чтобы пользовательский интерфейс мог обновляться при смене виртуальной машины, виртуальной машине необходимо реализовать INotifyPropertyChanged

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