将标签的文本绑定到 Xamarin forms c# 中的变量
Binding Label's Text to a Variable in Xamarin forms c#
所以我正在尝试创建一个简单的应用程序,例如购物应用程序。所以我有类别和每个类别的多个项目,当你选择一个项目时,你将有可能增加你需要的数量或删除该项目。例如,我选择了三个项目,所以我的购物车有 3 个项目,每个项目都有一个添加按钮和一个删除按钮。当我点击添加按钮时,显示的项目数量应该增加等等。
所以我到目前为止所做的是创建一个包含我所有类别的 JSON 文件,一旦我找到一个类别,我就会反序列化另一个包含我所有项目的 JSON 文件, 所以显示的项目当然取决于我选择的类别。
现在,每次我选择一个项目时,它都会被添加到购物车并显示在底部页面上,带有 + 和 - 按钮等等。
所以我创建了一个类别 class 来反序列化我的 json,并创建了一个对象 class 来反序列化我的项目 json。我在对象 class 中实现了 INotifyChangedProperty,这样我就可以在所选项目的数量增加时保持显示状态,所以基本上这就是我的 ViewModel,但我想这就像我需要每个创建的项目的 ViewModel 一样?所以我想我真正需要使用的是 ObservableCollection ..
我希望我解释得很好,并等待您对我做对或错的反馈以及我应该如何继续获得我想要的东西。非常感谢
以编程方式设置绑定
// 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
这些指导可能有助于解决您的问题。您的代码很乱,我认为这导致了您的困惑(您有几个名称非常相似)。
int Nbr_Objet;
public int nbr_objet { get{...} set {...}}
this.Nbr_Objet= Nbr_Objet;
这表明您正在直接设置成员变量 Nbr_Objet
,当您这样做时 属性 更改通知不会触发 - 您需要通过 public nbr_objet
才能实现。
我建议您在 XAML 中定义绑定,并确保绑定到 属性 nbr_objet
,而不是私有成员变量(字段)Nbr_Objet
.
如果您想避免混淆,请遵循 C# 编码标准并将您的成员变量命名为 _nbrObjet
,并将您的 属性 名称命名为 public int NbrObjet { get {...
.
the problems is that to set the bindingcontext to my "Objets" Class I have to put the arguments in it, and then my Label well get a precised value ... what should I do ?
我做了一个关于你模型的样本,你可以看看:
<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));
}
}
}
更新:
but I guess that it's like that I need a ViewModel of each created item ? so I guess what I really need to use is the ObservableCollection ..
你说你有3个category,每个category有很多item,如果你在ListView中显示这些,category作为Group header,建议你可以对不同的category使用相同的model,不同的item,然后加入Observablecollection,因为它实现了INotifyPropertyChanged接口。
关于ListView组,你可以看看:
https://github.com/xamarin/xamarin-forms-samples/tree/master/UserInterface/ListView/Grouping
如果你还有其他问题,我建议你可以创建新的线程来问,因为这个线程很长。
有帮助的回复记得标记为答案,谢谢
所以我正在尝试创建一个简单的应用程序,例如购物应用程序。所以我有类别和每个类别的多个项目,当你选择一个项目时,你将有可能增加你需要的数量或删除该项目。例如,我选择了三个项目,所以我的购物车有 3 个项目,每个项目都有一个添加按钮和一个删除按钮。当我点击添加按钮时,显示的项目数量应该增加等等。
所以我到目前为止所做的是创建一个包含我所有类别的 JSON 文件,一旦我找到一个类别,我就会反序列化另一个包含我所有项目的 JSON 文件, 所以显示的项目当然取决于我选择的类别。
现在,每次我选择一个项目时,它都会被添加到购物车并显示在底部页面上,带有 + 和 - 按钮等等。
所以我创建了一个类别 class 来反序列化我的 json,并创建了一个对象 class 来反序列化我的项目 json。我在对象 class 中实现了 INotifyChangedProperty,这样我就可以在所选项目的数量增加时保持显示状态,所以基本上这就是我的 ViewModel,但我想这就像我需要每个创建的项目的 ViewModel 一样?所以我想我真正需要使用的是 ObservableCollection ..
我希望我解释得很好,并等待您对我做对或错的反馈以及我应该如何继续获得我想要的东西。非常感谢
以编程方式设置绑定
// 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
这些指导可能有助于解决您的问题。您的代码很乱,我认为这导致了您的困惑(您有几个名称非常相似)。
int Nbr_Objet;
public int nbr_objet { get{...} set {...}}
this.Nbr_Objet= Nbr_Objet;
这表明您正在直接设置成员变量 Nbr_Objet
,当您这样做时 属性 更改通知不会触发 - 您需要通过 public nbr_objet
才能实现。
我建议您在 XAML 中定义绑定,并确保绑定到 属性 nbr_objet
,而不是私有成员变量(字段)Nbr_Objet
.
如果您想避免混淆,请遵循 C# 编码标准并将您的成员变量命名为 _nbrObjet
,并将您的 属性 名称命名为 public int NbrObjet { get {...
.
the problems is that to set the bindingcontext to my "Objets" Class I have to put the arguments in it, and then my Label well get a precised value ... what should I do ?
我做了一个关于你模型的样本,你可以看看:
<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));
}
}
}
更新:
but I guess that it's like that I need a ViewModel of each created item ? so I guess what I really need to use is the ObservableCollection ..
你说你有3个category,每个category有很多item,如果你在ListView中显示这些,category作为Group header,建议你可以对不同的category使用相同的model,不同的item,然后加入Observablecollection,因为它实现了INotifyPropertyChanged接口。
关于ListView组,你可以看看:
https://github.com/xamarin/xamarin-forms-samples/tree/master/UserInterface/ListView/Grouping
如果你还有其他问题,我建议你可以创建新的线程来问,因为这个线程很长。
有帮助的回复记得标记为答案,谢谢