C# 我的装订标签未更改[INotifyPropertyChanged]
我最近开始学习Xamarin,我偶然发现了以下问题。我的XAML文件中有一个标签,它绑定到ViewModel属性。我正在使用ICommand界面将点击手势绑定到ViewModel中的方法,该方法应该更新标签的文本。然而,它并没有更新“请触摸我一次!”。我只是想知道我做错了什么 主页xaml:C# 我的装订标签未更改[INotifyPropertyChanged],c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我最近开始学习Xamarin,我偶然发现了以下问题。我的XAML文件中有一个标签,它绑定到ViewModel属性。我正在使用ICommand界面将点击手势绑定到ViewModel中的方法,该方法应该更新标签的文本。然而,它并没有更新“请触摸我一次!”。我只是想知道我做错了什么 主页xaml: 代码隐藏: public分部类主页面:ContentPage { 公共主页() { 初始化组件(); BindingContext=新的MainPageViewModel(); } } 视图模型: c
代码隐藏:
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");
编辑-这是布兰登正确答案的延伸这就是问题所在。非常感谢。我想我应该提供已更改属性的新值,但应该是正在更改的属性本身。这就是问题所在。非常感谢。我认为我应该提供已更改属性的新值,但应该是正在更改的属性本身。