Xamarin表单按钮文本绑定失败

时间:2018-01-20 03:20:45

标签: c# xamarin data-binding xamarin.forms

我正在尝试将字符串绑定到按钮文本。

这是我的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,当我按下它时不会改变。我已经测试了命令绑定工作正常。

1 个答案:

答案 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