【问题标题】:Binding Label's Text to a Variable in Xamarin forms c#将标签的文本绑定到 Xamarin 表单中的变量 c#
【发布时间】:2020-02-23 07:58:00
【问题描述】:

所以我试图创建一个简单的应用程序,比如购物应用程序。所以我有类别和每个类别的多个项目,当您选择一个项目时,您将有可能增加您需要的项目数量或删除该项目。例如,我选择了三个项目,所以我的购物车有 3 个项目,每个项目都有一个添加按钮和一个删除按钮。当我点击添加按钮时,显示的项目数量应该会增加等等。

所以到目前为止我所做的是创建一个包含我所有类别的 JSON 文件,一旦我点击一个类别,我就可以反序列化另一个包含我所有项目的 JSON 文件,因此显示的项目取决于我的类别当然选择了。

现在,每次我选择一个项目时,它都会被添加到购物车中,并显示在底部页面上,并带有 + 和 - 按钮等。

所以我创建了一个类别类来反序列化我的 json,并创建一个对象类来反序列化我的项目的 json。我在 objets 类中实现了 INotifyChangedProperty,这样每当所选项目的数量增加时我就可以继续显示,所以基本上这就是我的 ViewModel,但我想这就像我需要每个创建项目的 ViewModel 一样?所以我想我真正需要使用的是 ObservableCollection ..

我希望我能很好地解释一切,并等待您的反馈,了解我的做法是对还是错,以及我应该如何继续得到我想要的。非常感谢

【问题讨论】:

  • 这是有据可查的 - 您阅读过有关绑定的文档吗? docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/…
  • @Shahid,如果要将变量绑定到Label.Text,当变量改变时,Label.Text也会改变,需要实现INotifyPropertychanged接口。你可以看看:xamarinhelp.com/xamarin-forms-binding
  • @shahid 您是否使用 Xaml 或 .CS 编码进行设计?我应该提供 xaml 吗?但对于 Xamarin 来说,这是非常基本的事情,您可以与文档进行交叉检查。
  • @Jason 我想用 C# 来做,找不到适合我的东西。是的,我做到了
  • @CherryBu-MSFT 确实如此,我将尝试使用您提供给我的示例来实现它并给您反馈。非常感谢

标签: c# xamarin xamarin.forms binding inotifypropertychanged


【解决方案1】:

问题是要将 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));
        }
    }
}

更新:

但我想这就像我需要每个已创建项目的 ViewModel 吗?所以我想我真正需要使用的是 ObservableCollection ..

你说你有三个分类,每个分类有很多item,如果你在ListView中显示这些,category作为Group header,我建议你可以为不同分类的不同item使用相同的模型,然后添加在 Observablecollection 中,因为它实现了 INotifyPropertyChanged 接口。

关于ListView组,大家可以看看:

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

如果你还有其他问题,我建议你可以创建一个新线程来提问,因为这个线程很长。

请记得将有用的回复标记为答案,谢谢。

【讨论】:

  • 非常感谢,这让我看得更清楚。我将再次编辑我的问题,以便你们可以看到我想要做什么,也许我做错了。
【解决方案2】:

以编程方式设置绑定

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

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

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

【讨论】:

  • 我在 VM 中正确实现了 INotifyPropertyChanged,如下所示:xamarinhelp.com/xamarin-forms-binding。并添加了绑定以及绑定上下文,但由于某种原因应用程序停止响应。我什至没有得到异常
  • 没有看到你的实际代码,我们无法帮助你调试这个
  • Okey 我设法让它工作,我想我现在需要的只是正确设置绑定上下文,问题是 MyViewModel 是一个有多个参数的类,但如果我精确那么参数值正是我将得到的!我使用的这个类是我基于反序列化我的 json 文件的类......你能建议我任何解决方案吗?
  • 再一次,没有看到你的代码,我无法帮助你
  • 编辑问题
【解决方案3】:

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

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

【讨论】:

  • 非常感谢,但我遇到的问题是设置绑定上下文,如何在 XAML 中设置?
  • @ShahidOd 你能发布你目前所拥有的吗?您可以删除任何不相关的内容,但尝试包含页面/组件级别的 XAML 以及标签。
  • 我将再次编辑我的问题,以便你们可以看到我想要做什么,也许我做错了。
猜你喜欢
  • 2019-03-16
  • 2016-12-30
  • 2018-11-15
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 2011-03-09
  • 1970-01-01
相关资源
最近更新 更多