Почему staticpropertychanged null? - PullRequest
0 голосов
/ 07 мая 2020

Я разрабатываю приложение UWP. У меня есть класс Client, который управляет подключением к другому приложению с помощью сокетов.

В моем классе ViewModel у меня есть свойство stati c с именем TextConnect, которое привязано к текстовому полю в моем представлении.

Я хочу, чтобы после установления соединения в текстовом поле отображалось «Подключено». Итак, мой класс ViewModel реализует INotifyPropertyChanged, и у меня есть stati c EventHandler с именем StaticPropertyChanged, который я использовал для уведомления представления об изменении моего свойства TextConnect:

public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

И в моем Класс клиента. Я изменил значение этого свойства при установлении соединения:

ViewModel.TextConnect = "Connected";

Метод, изменяющий свойство TextConnect в моем классе Client, выполняется в другом потоке.

Но когда я пытаюсь изменить значение свойства, у меня появляется ошибка, в которой говорится, что мое событие StaticPropertyChanged имеет значение null:

System.NullReferenceException : 'Object reference not set to an instance of an object.'

Почему StaticPropertyChanged имеет значение null, а мое свойство привязать к моему текстовому полю?

1 Ответ

1 голос
/ 08 мая 2020

Я хочу отображать «Подключено» в текстовом поле, когда соединение установлено. Итак, мой класс ViewModel реализует INotifyPropertyChanged, и у меня есть stati c EventHandler с именем StaticPropertyChanged

Если вы хотите привязать свойство TextBox Text к свойству ViewModel s TextConnect, TextConnect должен быть нестатичным c, потому что нам нужно вызвать PropertyChanged в методе set (не может работать в методе stati c). Если вы хотите получить доступ к TextConnect статически, вы можете создать свойство stati c Current для ViewModel. Подробные инструкции см. В следующем коде.

Xaml

<ToggleSwitch Header="This is header" IsOn="{Binding IsOpen}" />

ViewModel

public class MainPageViewModel : INotifyPropertyChanged
{
    public static MainPageViewModel Current;
    public MainPageViewModel()
    {
        Current = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
    private bool _isOpen;

    public bool IsOpen
    {
        get { return _isOpen; }
        set { _isOpen = value; OnPropertyChanged(); }
    }
}

Использование

MainPageViewModel.Current.IsOpen = true;
...