我开发了一个UWP应用程序。我有一个类Client,它通过套接字管理与另一个应用程序的连接。
在我的ViewModel类中,我有一个名为TextConnect的静态属性,它绑定到我的View中的一个文本框。
当建立连接时,我想在文本框中显示"已连接"。因此,我的ViewModel类实现了INotifyPropertyChanged,并且我有一个名为StaticPropertyChanged的静态EventHandler,我用它来通知视图我的TextConnect属性发生了更改:
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
在我的Client类中,当建立连接时,我更改了这个属性的值:
ViewModel.TextConnect = "Connected";
修改Client类中TextConnect属性的方法在另一个线程中运行。
但是,当我尝试更改属性的值时,我会出现一个错误,表明我的事件StaticPropertyChanged为null:
System.NullReferenceException : 'Object reference not set to an instance of an object.'
当我的属性绑定到文本框时,为什么StaticPropertyChanged为null?
当建立连接时,我想在文本框中显示"已连接"。因此,我的ViewModel类实现了INotifyPropertyChanged,并且我有一个名为StaticPropertyChanged 的静态EventHandler
如果您想将TextBoxText
属性与ViewModel
的TextConnect
属性绑定,TextConnect应该是非静态的,因为我们需要在set方法中调用PropertyChanged
(不能在静态方法中运行(。如果要静态访问TextConnect
,可以为ViewModel设置静态Current
属性。有关详细步骤,请参阅以下代码。
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;