装订标签';将文本转换为Xamarin形式的变量c#
所以我尝试创建一个简单的应用程序,比如购物应用程序。因此,我有类别和每个类别的多个项目,当你选择一个项目,那么你将有可能增加多少你需要或删除该项目。例如,我选择了三个项目,所以我的购物车有三个项目,其中每个项目都有一个添加按钮和一个删除按钮。当我点击add按钮时,显示的项目数量应该增加,以此类推 到目前为止,我所做的是创建一个包含所有类别的JSON文件,一旦我点击了一个类别,我就可以反序列化另一个包含所有项目的JSON文件,因此显示的项目当然取决于我选择的类别 现在,每次我选择一个项目,它就会被添加到购物车中,并在底部页面显示+和-按钮,以此类推 因此,我创建了一个category类来反序列化我的json,并创建了一个objets类来反序列化我的项目的json。我在Objects类中实现了INotifyChangedProperty,这样每当所选项目的数量增加时,我就可以继续显示,所以基本上这就是我的ViewModel,但我想我需要每个创建项目的ViewModel?所以我想我真正需要使用的是可观测的集合装订标签';将文本转换为Xamarin形式的变量c#,c#,xamarin,xamarin.forms,binding,inotifypropertychanged,C#,Xamarin,Xamarin.forms,Binding,Inotifypropertychanged,所以我尝试创建一个简单的应用程序,比如购物应用程序。因此,我有类别和每个类别的多个项目,当你选择一个项目,那么你将有可能增加多少你需要或删除该项目。例如,我选择了三个项目,所以我的购物车有三个项目,其中每个项目都有一个添加按钮和一个删除按钮。当我点击add按钮时,显示的项目数量应该增加,以此类推 到目前为止,我所做的是创建一个包含所有类别的JSON文件,一旦我点击了一个类别,我就可以反序列化另一个包含所有项目的JSON文件,因此显示的项目当然取决于我选择的类别 现在,每次我选择一个项目,它就会被
我希望我把一切都解释得很好,并等待你们的反馈,告诉我我做得对还是错,以及我应该如何继续得到我想要的。非常感谢您以编程方式设置绑定
// 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以编程方式设置绑定
// 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这是一些可能有助于解决问题的指导。您的代码很混乱,我认为这导致了您的混淆(您有几个名称非常相似的东西) 这表明您正在直接设置成员变量
Nbr\u Objet
,当您这样做时,属性更改通知不会触发-您需要通过publicNbr\u Objet
分配该值才能实现
我建议您在XAML中定义绑定,并确保绑定到属性nbr\u objet
,而不是私有成员变量(字段)nbr\u objet
。
如果您想避免混淆,请遵循C#编码标准,命名您的成员变量
\u nbrObjet
,并使用camel-case命名您的属性名public int nbrObjet{get{…
这是一些可能有助于解决您的问题的指南。您的代码很乱,我认为这是造成您混淆的原因(你有几个名字很相似的东西)
这表明您正在直接设置成员变量Nbr\u Objet
,当您这样做时,属性更改通知不会触发-您需要通过publicNbr\u Objet
分配该值才能实现
我建议您在XAML中定义绑定,并确保绑定到属性nbr\u objet
,而不是私有成员变量(字段)nbr\u objet
。
如果您想避免混淆,请遵循C#编码标准,将您的成员变量命名为\u nbrObjet
,并将属性名命名为camel casepublic int nbrObjet{get{…
问题在于,要将bindingcontext设置到我的“Objects”类,我必须将参数放入其中,然后我的标签会得到一个精确的值……我应该怎么做
我为您的模型做了一个示例,您可以看看:
<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));
}
}
}
公共部分类第15页:内容页
{
公共对象模型{get;set;}
公共页15()
{
初始化组件();
型号=新的Objets(“试验1”,1.001f,“试验11111”,12);
this.BindingContext=模型;
label1.SetBinding(Label.TextProperty,“nbr_对象”);
}
私有无效Btn1_已单击(对象发送方,事件参数e)
{
型号:nbr_objet=20;
}
}
公共类对象:INotifyPropertyChanged
{
公共字符串名称{get;set;}
公共浮动优先级{get;set;}
公共字符串imageUrl{get;set;}
私人内特Nbr_Objet;
公共int nbr_objet
{
获取{return Nbr_Objet;}
设置
{
Nbr_Objet=数值;
RaisePropertyChanged(“nbr_对象”);
}
}
公共对象(字符串名称、浮动优先级、字符串图像URL、int Nbr_对象)
{
这个名称=名称;
这个.Prix=Prix;
this.imageUrl=imageUrl;
this.Nbr_Objet=Nbr_Objet;
}
公共事件属性更改事件处理程序属性更改;
public void RaisePropertyChanged(字符串propertyName)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
更新:
但我想这就像我需要一个每个创建项的ViewModel?所以我想我真正需要使用的是ObservableCollection
您说过您有三个类别,每个类别都有许多项,如果您在ListView中显示它们,类别将用作组标题,我建议您可以对不同类别的不同项使用相同的模型,然后添加Observablecollection,因为它实现了INotifyPropertyChanged接口
关于ListView组,您可以查看:
<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));
}
}
}
如果您还有其他问题,我建议您可以创建新的提问线程,因为该线程非常长
请记住将有用的回答标记为答案,谢谢
问题在于,要将bindingcontext设置到我的“Objects”类,我必须将参数放入其中,然后我的标签会得到一个精确的值……我应该怎么做
我为您的模型做了一个示例,您可以看看:
<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));
}
}
}