Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
装订标签';将文本转换为Xamarin形式的变量c#_C#_Xamarin_Xamarin.forms_Binding_Inotifypropertychanged - Fatal编程技术网

装订标签';将文本转换为Xamarin形式的变量c#

装订标签';将文本转换为Xamarin形式的变量c#,c#,xamarin,xamarin.forms,binding,inotifypropertychanged,C#,Xamarin,Xamarin.forms,Binding,Inotifypropertychanged,所以我尝试创建一个简单的应用程序,比如购物应用程序。因此,我有类别和每个类别的多个项目,当你选择一个项目,那么你将有可能增加多少你需要或删除该项目。例如,我选择了三个项目,所以我的购物车有三个项目,其中每个项目都有一个添加按钮和一个删除按钮。当我点击add按钮时,显示的项目数量应该增加,以此类推 到目前为止,我所做的是创建一个包含所有类别的JSON文件,一旦我点击了一个类别,我就可以反序列化另一个包含所有项目的JSON文件,因此显示的项目当然取决于我选择的类别 现在,每次我选择一个项目,它就会被

所以我尝试创建一个简单的应用程序,比如购物应用程序。因此,我有类别和每个类别的多个项目,当你选择一个项目,那么你将有可能增加多少你需要或删除该项目。例如,我选择了三个项目,所以我的购物车有三个项目,其中每个项目都有一个添加按钮和一个删除按钮。当我点击add按钮时,显示的项目数量应该增加,以此类推

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

现在,每次我选择一个项目,它就会被添加到购物车中,并在底部页面显示+和-按钮,以此类推

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


我希望我把一切都解释得很好,并等待你们的反馈,告诉我我做得对还是错,以及我应该如何继续得到我想要的。非常感谢您以编程方式设置绑定

// 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
,当您这样做时,属性更改通知不会触发-您需要通过public
Nbr\u Objet
分配该值才能实现

我建议您在XAML中定义绑定,并确保绑定到属性
nbr\u objet
,而不是私有成员变量(字段)
nbr\u objet

如果您想避免混淆,请遵循C#编码标准,命名您的成员变量
\u nbrObjet
,并使用camel-case命名您的属性名
public int nbrObjet{get{…

这是一些可能有助于解决您的问题的指南。您的代码很乱,我认为这是造成您混淆的原因(你有几个名字很相似的东西)

这表明您正在直接设置成员变量
Nbr\u Objet
,当您这样做时,属性更改通知不会触发-您需要通过public
Nbr\u Objet
分配该值才能实现

我建议您在XAML中定义绑定,并确保绑定到属性
nbr\u objet
,而不是私有成员变量(字段)
nbr\u objet
。 如果您想避免混淆,请遵循C#编码标准,将您的成员变量命名为
\u nbrObjet
,并将属性名命名为camel case
public 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));
        }
    }
}