在Xamarin表单中将标签文本绑定到变量

yjghlzjz  于 2023-03-16  发布在  其他
关注(0)|答案(3)|浏览(190)

所以我试图创建一个简单的应用程序,如购物应用程序。所以我有类别和多个项目的每个类别,当你选择一个项目,然后你将有可能增加多少你需要或删除该项目。例如,我选择了三个项目,所以我的购物车有3个项目,每个项目都有一个添加按钮和一个删除按钮。当我点击添加按钮时,显示的项目数量应该增加,等等。
到目前为止,我所做的是创建一个包含所有类别的JSON文件,一旦我点击了一个类别,我就可以反序列化另一个包含所有项目的JSON文件,因此显示的项目当然取决于我选择的类别。
现在,每次我选择一个项目,它会被添加到购物车,并显示在底部的页面与+和-按钮等。
因此,我创建了一个category类来反序列化我的json,并创建了一个objets类来反序列化我的Item的json。我在objets类中实现了INotifyChangedProperty,以便每当所选项目的数量增加时,我都可以继续显示,这基本上是我的ViewModel,但我猜这就像我需要每个创建的项目的ViewModel一样?所以我猜我真正需要使用的是ObservableCollection。
我希望我解释清楚了每件事,并等待您的反馈,如果我这样做是正确的或错误的,我应该如何进行得到我想要的。

o2rvlv0m

o2rvlv0m1#

问题是,要将bindingcontext设置为我的“Objets”类,我必须将参数放入其中,然后我的Label将得到一个精确的值...我应该怎么做?
我已经为你的模型写了一个示例,你可以看看:

<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));
        }
    }
}

更新日期:

但我想这就像我需要每个创建的项目的视图模型一样?所以我想我真正需要使用的是ObservableCollection ..
您说您有三个类别,每个类别有很多项目,如果您在ListView中显示这些,类别用作Group头,我建议您可以对不同类别的不同项目使用相同的模型,然后在Observablecollection中添加,因为它已经实现了INotifyPropertyChanged接口。
关于ListView组,你可以看看:
https://github.com/xamarin/xamarin-forms-samples/tree/master/UserInterface/ListView/Grouping
如果你还有其他问题,我建议你可以创建新的线程来问,因为这个线程很长。

s3fp2yjn

s3fp2yjn2#

以编程方式设置绑定

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

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

为了在VM更改时更新UI,VM需要实现INotifyPropertyChanged

cbwuti44

cbwuti443#

这是一些可能对你的问题有帮助的指导。你的代码很乱,我认为这是导致你困惑的原因(你有几个名字非常相似的东西)。

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 {...

相关问题