我正在尝试将字符串绑定到按钮文本。
这是我的viewmodel。
public class MainPageViewModel : BaseViewModel
{
private IUserDialogs _dialog;
private const string START = "Start";
private const string STOP = "Stop";
public ICommand Start { get; }
public string startText { get; set; }
public MainPageViewModel(IUserDialogs dialogManager)
{
_dialog = dialogManager;
Start = new Command(()=>toggleStart());
startText = START;
}
private void toggleStart()
{
if(startText.Equals(START))
{
startText = STOP;
_dialog.Toast("Start Monitoring");
}
else if (startText.Equals(STOP))
{
startText = START;
}
}
}
这是我的xaml。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ble.net.sampleapp.view.MainPage"
Title="Monitor">
<RelativeLayout>
<Button Text="{Binding startText}"
Command="{Binding Start}"/>
</RelativeLayout>
</ContentPage>
我想在按下时按钮文本在开始和停止之间切换。但是,它最初显示Start,当我按下它时不会改变。我已经测试了命令绑定工作正常。
答案 0 :(得分:1)
为了使视图考虑到startText
的更改,您必须通知该属性的更改。 Here它解释了PropertyChanged
和一些实现。
我不太确定你的BaseViewModel
是什么,但我想它实现了INotifyPropertyChanged
。因此,在您的财产的设定者中,您必须致电PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
,即:
private string _startText;
public string StartText
{
get => this._startText;
set
{
this._startText;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(StartText)));
}
}
并且会在PropertyChanged
被提升时通知您的视图更新其值。
显然,可以通过使用一个使用属性名称调用事件的方法来改进它。
此外,您可以使用Fody.PropertyChanged在ViewModel的公共属性中自动引发PropertyChanged。
HIH