Xamarin.Forms绑定标签的IsVisibleProperty属性

3
我的登录页面有一个标签,当身份验证失败时,我会显示一个错误消息。在绘制它时,我将可见性设置为false。身份验证后,我想回到ContentPage并将标签设置为可见。但它就是不起作用。我尝试将BindingMode枚举设置为TwoWay,但那会立即启用它,然后我无法关闭它。
在LoginPage中:
Label errorMessage = new Label { IsVisible = false, Text = "Invalid credentials please try again", TextColor = Color.Red };
errorMessage.SetBinding(IsVisibleProperty, LoginViewModel.ErrorMessagePropertyName);

在ViewModel页面中
public const string ErrorMessagePropertyName = "DisplayError";
private bool _displayError = false;
private bool DisplayError
{
    get { return _displayError; }
    set
    {
        if (value.Equals(_displayError)) return;

        _displayError = value;
        OnPropertyChanged();
    }
}

我的按钮绑定到与上述相同的视图模型类中,如果它没有通过简单身份验证,它会尝试设置DisplayError属性。

protected async Task ExecuteLoginCommand()
{
    string eventMessage= string.Format("Authenticating User:{0} on {1}", UserName, DateTime.UtcNow);
    Logger.LogEvent(eventMessage);

    if(UserName == "g" && Password.Length > 2)
    {
        Application.Current.Properties.Add(Constants.KEY_IS_AUTHENTICATED, true);

        await _navigation.PopAsync();
    }
    else
    {
        DisplayError = true;
        string message = string.Format("Invalid user tried to log into device at this time {0}",DateTime.Now);
        Logger.LogEvent(message);
    }

    Debug.WriteLine(UserName);
    Debug.WriteLine(Password);
}

OnPropertyChanged方法

protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this,
            new PropertyChangedEventArgs(propertyName));
    }
}

你的 OnPropertyChanged 是什么样子的?你是否正确设置了 BindingContext - Johan
你为什么要将布尔类型的IsVisible属性绑定到字符串类型的ErrorMessagePropertyName上? - Mage Xy
这是保存在常量中的“DisplayError”的名称。这样做是可以的,即使乍一看看起来很奇怪。 - Wosi
1个回答

2

将属性DisplayError公开,以便其他类可以看到它。如果仍然无法正常工作,请将绑定更改为:

 errorMessage.SetBinding(Label.IsVisibleProperty, LoginViewModel.ErrorMessagePropertyName); 

愚蠢的错误,问题是Dispaly error属性是私有的,这导致了问题。 - InitLipton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接