C# 我的装订标签未更改[INotifyPropertyChanged]

C# 我的装订标签未更改[INotifyPropertyChanged],c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我最近开始学习Xamarin,我偶然发现了以下问题。我的XAML文件中有一个标签,它绑定到ViewModel属性。我正在使用ICommand界面将点击手势绑定到ViewModel中的方法,该方法应该更新标签的文本。然而,它并没有更新“请触摸我一次!”。我只是想知道我做错了什么 主页xaml: 代码隐藏: public分部类主页面:ContentPage { 公共主页() { 初始化组件(); BindingContext=新的MainPageViewModel(); } } 视图模型: c

我最近开始学习Xamarin,我偶然发现了以下问题。我的XAML文件中有一个标签,它绑定到ViewModel属性。我正在使用ICommand界面将点击手势绑定到ViewModel中的方法,该方法应该更新标签的文本。然而,它并没有更新“请触摸我一次!”。我只是想知道我做错了什么

主页xaml:


代码隐藏:

public分部类主页面:ContentPage
{
公共主页()
{
初始化组件();
BindingContext=新的MainPageViewModel();
}
}
视图模型:

class MainPageViewModel:INotifyPropertyChanged
{
私有字符串_messageContent;
公共MainPageViewModel()
{
MessageContent=“请触摸我一次!”;
OnLabelTouchedCmd=new命令(()=>{MessageContent=“嘿,别再找我了!”;});
}
public ICommand OnLabelTouchedCmd{get;private set;}
公共字符串消息内容
{
get=>\u messageContent;
设置
{
_messageContent=值;
OnPropertyChanged(价值);
}
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged(字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
您调用的参数错误,如下所示:

protected virtual Void OnPropertyChanged ([System.Runtime.CompilerServices.CallerMemberName] String propertyName)
它需要属性的名称,而不是您现在传递的值。请尝试以下方法:

public string MessageContent
{
    get => _messageContent;
    set
    {
        _messageContent = value;
         OnPropertyChanged("MessageContent");
    }
}
您打电话时使用了错误的参数,如图所示:

protected virtual Void OnPropertyChanged ([System.Runtime.CompilerServices.CallerMemberName] String propertyName)
它需要属性的名称,而不是您现在传递的值。请尝试以下方法:

public string MessageContent
{
    get => _messageContent;
    set
    {
        _messageContent = value;
         OnPropertyChanged("MessageContent");
    }
}
解释 当前代码不工作,因为它正在将属性的
传递到
OnPropertyChanged

相反,我们需要将属性的名称作为
字符串
传递到
OnPropertyChanged

答复 我们可以利用
CallerMemberName
属性使代码更加简洁,并在调用
OnPropertyChanged
时避免硬编码字符串

[CallerMemberName]
添加到
OnPropertyChanged
的参数中,可以从属性的setter调用
OnPropertyChanged()
,属性名称会自动传递到参数中

更新方法 更新的视图模型
class MainPageViewModel:INotifyPropertyChanged
{
私有字符串_messageContent;
...
公共字符串消息内容
{
get=>\u messageContent;
设置
{
_messageContent=值;
OnPropertyChanged();
}
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
解释 当前代码不工作,因为它正在将属性的
传递到
OnPropertyChanged

相反,我们需要将属性的名称作为
字符串
传递到
OnPropertyChanged

答复 我们可以利用
CallerMemberName
属性使代码更加简洁,并在调用
OnPropertyChanged
时避免硬编码字符串

[CallerMemberName]
添加到
OnPropertyChanged
的参数中,可以从属性的setter调用
OnPropertyChanged()
,属性名称会自动传递到参数中

更新方法 更新的视图模型
class MainPageViewModel:INotifyPropertyChanged
{
私有字符串_messageContent;
...
公共字符串消息内容
{
get=>\u messageContent;
设置
{
_messageContent=值;
OnPropertyChanged();
}
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged([CallerMemberName]字符串propertyName=null)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}

还要查看所定位的ViewModelBase,让您的所有ViewModels继承自它。您可以通过以下两种方式之一调用OnPropertyChanged。第一个将只取调用成员的名称,在本例中为您的公共财产

OnPropertyChanged();

OnPropertyChanged("MyProperty");

编辑-这是Brandon正确答案的延伸

另请查看位于的ViewModelBase,让您的所有ViewModels继承自它。您可以通过以下两种方式之一调用OnPropertyChanged。第一个将只取调用成员的名称,在本例中为您的公共财产

OnPropertyChanged();

OnPropertyChanged("MyProperty");

编辑-这是布兰登正确答案的延伸

这就是问题所在。非常感谢。我想我应该提供已更改属性的新值,但应该是正在更改的属性本身。这就是问题所在。非常感谢。我认为我应该提供已更改属性的新值,但应该是正在更改的属性本身。