PropertyChange всегда возвращать NULL в UWP? - PullRequest
0 голосов
/ 06 сентября 2018

Я делаю приложение магазина UWP для Windows 10. Я использую API и подключаюсь к серверу.

Мне просто нужно привязать текстовое поле к сообщению об ошибке при неверном входе в систему. Но при вызове метода OnPropertyChanged eventHandler всегда возвращает значение null?

public LoginPasswordView()
{
    this.InitializeComponent();
    var vm = new LoginPasswordViewModel(new NavigationService(), new LoginService());
    this.DataContext = vm;      
}

viewmodel.cs

public class LoginPasswordViewModel : MainViewBaseModel
{
    private string password;
    private string errorMessage="We need this info to countinue";

    public LoginPasswordViewModel(INavigationService navigationService, ILoginService loginService)
    {
        _navigationService = navigationService;
        _loginService = loginService;
    }

    private INavigationService _navigationService { get; set; }
    private ILoginService _loginService { get; set; }

    public string Errormessage
    {
        get
        {
            return errorMessage;
        }
        set
        {
            errorMessage = value;
            OnPropertyChanged("Errormessage");
        }
    }
}

public class MainViewBaseModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
            eventHandler(this, new PropertyChangedEventArgs(propertyName));           
    }
}

XAML:

<TextBlock Text="{Binding Path=Errormessage,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="250,25,0,0" FontSize="24" FontFamily="Segoe Pro" Foreground="Red"/>

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Если ваш пользовательский класс реализует интерфейс INotifyPropertyChanged и вызывает обработчик OnPropertyChanged в свойстве set, он уведомит пользовательский интерфейс, обычно связывающий клиентов, об изменении значения свойства.

Итак, ваша проблема на самом деле в том, как вы меняете значение свойства, но я не видел, где вы меняете значение Errormessage в приведенном выше коде.

Я сделал простой пример кода для вашей справки в соответствии с вашим кодом.

<StackPanel>
    <TextBox Text="{Binding Password,Mode=TwoWay}"></TextBox>
    <TextBlock Text="{Binding Path=Errormessage,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Margin="250,25,0,0" FontSize="24" FontFamily="Segoe Pro" Foreground="Red"/>
</StackPanel>
public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        var vm = new LoginPasswordViewModel();
        this.DataContext = vm;
    }
}

public class LoginPasswordViewModel : MainViewBaseModel
{
    private string password;
    private string errorMessage = "We need this info to countinue";

    public LoginPasswordViewModel()
    {

    }

    public string Password
    {
        get { return password; }
        set
        {
            password = value;
            if (string.IsNullOrEmpty(Password.Trim()))
            {
                Errormessage = "Password cannot be null or empty!";
            }
            else
            {
                Errormessage = string.Empty;
            }
            OnPropertyChanged("Password");
        }
    }


    public string Errormessage
    {
        get
        {
            return errorMessage;
        }
        set
        {
            errorMessage = value;
            OnPropertyChanged("Errormessage");
        }
    }
}

public class MainViewBaseModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
    }
}
0 голосов
/ 06 сентября 2018

используйте x: Bind вместо Binding синтаксис, x: Bind намного более гибок и производителен, и у вас меньше вероятность ошибок.

https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/x-bind-markup-extension

и поскольку вы используете INotifyPropertyChanged , вам следует использовать Mode = "OneWay" с x: Bind дополнительные подробности можно увидеть по ссылке, приведенной выше.

...