C# 当我使用propertychanged将字符串绑定到XAML时,为什么不获取任何文本?塞马林
尝试通过字符串将文本绑定到我的xaml,并使用propertychanged函数根据int的值更改文本。 这是我的代码: 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 {
我现在没有收到任何文本。这不是
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");
}
}
}
}