C# 当我使用propertychanged将字符串绑定到XAML时,为什么不获取任何文本?塞马林

C# 当我使用propertychanged将字符串绑定到XAML时,为什么不获取任何文本?塞马林,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,尝试通过字符串将文本绑定到我的xaml,并使用propertychanged函数根据int的值更改文本。 这是我的代码: XAML: 我现在没有收到任何文本。这不是OnPropertyChanged()的工作方式。您不应该传递希望显示为参数的新文本,而应该将新文本指定给info字段,并将属性的名称作为参数 OnPropertyChanged(name)所做的是告诉XAML属性name已更改,XAML将在该属性上获取该属性,并相应地更新显示的值 public string Forename {

尝试通过字符串将文本绑定到我的xaml,并使用propertychanged函数根据int的值更改文本。 这是我的代码:

XAML:


我现在没有收到任何文本。

这不是
OnPropertyChanged()
的工作方式。您不应该传递希望显示为参数的新文本,而应该将新文本指定给info字段,并将属性的名称作为参数

OnPropertyChanged(name)
所做的是告诉XAML属性
name
已更改,XAML将在该属性上获取该属性,并相应地更新显示的值

public string Forename {

    get {
        return info;
    }
    set {
        if (myInt == 0) {
            info = value;
            OnPropertyChanged ("Forename");
        }

        else if (myInt == 1)
        {
            info = "TextTwo";
            OnPropertyChanged ("Forename");

        }
        else 
        {
            info = "TextThree";
            OnPropertyChanged ("Forename");
        }
    }
}
编辑


由于您对在PropertyChanged(string propertyName)上应将什么放入受保护的虚拟void中有一些疑问,因此该函数的方式很好。调用它时,它将使用
PropertyChangedEventHandler PropertyChanged
让事件的所有subscriber知道属性propertyName已更改。XAML
{Binding Forename}
充当
属性changed
的订阅者/监听器,并在被告知绑定到的属性(“Forename”)已更改时立即更新其文本。这就是您在调用PropertyChanged(“Forename”)时发生的情况

编辑2 似乎您可能忘记了指定DataContext 在XAML的代码背后(将命名为mainwindow.XAML.cs)

并将名字代码移到一个单独的类中,名为ViewModel。像这样:

public class ViewModel{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged (string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null) {
            PropertyChanged (this, new PropertyChangedEventArgs (propertyName));    
        }

    }

string info;
int myInt = 0;

public string Forename {

    get {
        return info;
    }
    set {
        if (myInt == 0) {
            info = value;
            OnPropertyChanged ("Forename");
        }

        else if (myInt == 1)
        {
            info = "TextTwo";
            OnPropertyChanged ("Forename");

        }
        else 
        {
            info = "TextThree";
            OnPropertyChanged ("Forename");
        }
    }
}
}

这不是
OnPropertyChanged()
的工作方式。您不应该传递希望显示为参数的新文本,而应该将新文本指定给info字段,并将属性的名称作为参数

OnPropertyChanged(name)
所做的是告诉XAML属性
name
已更改,XAML将在该属性上获取该属性,并相应地更新显示的值

public string Forename {

    get {
        return info;
    }
    set {
        if (myInt == 0) {
            info = value;
            OnPropertyChanged ("Forename");
        }

        else if (myInt == 1)
        {
            info = "TextTwo";
            OnPropertyChanged ("Forename");

        }
        else 
        {
            info = "TextThree";
            OnPropertyChanged ("Forename");
        }
    }
}
编辑


由于您对在PropertyChanged(string propertyName)上应将什么放入受保护的虚拟void中有一些疑问,因此该函数的方式很好。调用它时,它将使用
PropertyChangedEventHandler PropertyChanged
让事件的所有subscriber知道属性propertyName已更改。XAML
{Binding Forename}
充当
属性changed
的订阅者/监听器,并在被告知绑定到的属性(“Forename”)已更改时立即更新其文本。这就是您在调用PropertyChanged(“Forename”)时发生的情况

编辑2 似乎您可能忘记了指定DataContext 在XAML的代码背后(将命名为mainwindow.XAML.cs)

并将名字代码移到一个单独的类中,名为ViewModel。像这样:

public class ViewModel{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged (string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null) {
            PropertyChanged (this, new PropertyChangedEventArgs (propertyName));    
        }

    }

string info;
int myInt = 0;

public string Forename {

    get {
        return info;
    }
    set {
        if (myInt == 0) {
            info = value;
            OnPropertyChanged ("Forename");
        }

        else if (myInt == 1)
        {
            info = "TextTwo";
            OnPropertyChanged ("Forename");

        }
        else 
        {
            info = "TextThree";
            OnPropertyChanged ("Forename");
        }
    }
}
}

通过查看您的代码,我怀疑您在
绑定中犯了最常见的错误。您没有对正确的属性进行更改。其想法是XAML必须知道属性已更改以更新UI-因此,它将在紧密循环中运行,并检查属性值是否与屏幕上的属性值不同。Microsoft将
delegate
命名为
PropertyChanged
。主要用于getter/setter

在使用此委托时必须非常小心,因为在.NET Framework的第4版之前,委托的参数是
string
——属性的名称。更高版本的.NET Framework带来了特殊属性-以下是示例:


在您的情况下,您将引发property changed事件,但在参数中,您将发送不存在的属性名称:(您应发送
OnPropertyChanged(“Forename”)
仅限。

通过查看您的代码,我怀疑您在
绑定中犯了最常见的错误。您并没有对正确的属性进行更改。其想法是XAML必须知道该属性已更改以更新UI-因此,应在紧循环中运行,并检查属性值是否与屏幕上的不同crosoft提出了名为
PropertyChanged
delegate
的想法。主要用于getter/setter

在使用此委托时必须非常小心,因为在.NET Framework第4版之前,委托的参数为
string
-属性的名称。更高版本的.NET Framework带来了特殊属性-以下是示例:


在您的情况下,您引发了property changed事件,但在参数中,您发送了不存在的属性名称:(您应该只发送
OnPropertyChanged(“Forename”)

为什么要使用“TextOne”、“textwo”和“TextThree”作为属性名?它看起来像属性名是
Forename
。啊哈,我以为它在那里,我为我的标签制作了文本?不…把属性名放在那里。新的文本值应该只是属性值,所以在setter方法中,您需要始终将
info
设置为您想要的属性值。然后启动OnPropertyChanged。它使用属性名称来知道哪个属性已更改。为什么要使用“TextOne”、“TextTwo”和“TextThree”作为属性名?它看起来像属性名是
Forename
。啊哈,我以为它在那里,我为我的标签制作了文本?不…把属性名放在那里。新的文本值应该只是属性值,所以在setter方法中,您需要始终将
info
设置为您想要的属性值。然后启动OnPropertyChanged。它使用属性名称来知道更改了哪个属性。受保护的虚拟void OnPropertyChanged(“Forename”)//错误:意外符号“Forename”不应更改方法定义
public class ViewModel{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged (string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null) {
            PropertyChanged (this, new PropertyChangedEventArgs (propertyName));    
        }

    }

string info;
int myInt = 0;

public string Forename {

    get {
        return info;
    }
    set {
        if (myInt == 0) {
            info = value;
            OnPropertyChanged ("Forename");
        }

        else if (myInt == 1)
        {
            info = "TextTwo";
            OnPropertyChanged ("Forename");

        }
        else 
        {
            info = "TextThree";
            OnPropertyChanged ("Forename");
        }
    }
}
}