WPF的MVVM模式提供的数据绑定方式简单化了数据更新反馈到界面的步骤,但是在静态数据绑定时需要使用事件调用方法向程序发送调用通知。
需要注意使用PropertyChanged的方法是无效的:
ViewModel的代码:
private static string _connectstr;
public static string ConnectStr
{
get { return _connectstr; }
set
{
_connectstr = value;
//调用通知
StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(nameof(_connectstr)));
}
}
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;//静态事件处理属性更改
界面内设置的代码:
<TextBlock Text="{Binding Path=(viewmodel:MainViewModel.ConnectStr)}"
Margin="15 15 0 0" FontSize="26" Foreground="#007DFA" Canvas.Right="18"/>
如上,采用PropertyChanged的方法在实际的程序运行过程中,界面只会在初始化阶段采用静态变量ConnectStr的值。
根据链接的解答,在指定 Path 属性时,绑定将定位静态变量并绑定到该属性 . 在这种情况下,静态变量ConnectStr的属性是源, 而StaticPropertyChanged 事件用于通知绑定有关更新 。可以注意到,INotifyPropertyChanged 在绑定到静态属性的情况下不能使用,因为没有实例用于访问该属性 . 必须使用相应的静态事件。
这里,可以使用EventHandler (事件仅通知相应属性的更改),对代码作如下更改:
//静态属性调用通知
public static event EventHandler ConnectStrChanged;
private static string _connectstr;
public static string ConnectStr
{
get { return _connectstr; }
set
{
_connectstr = value;
//调用通知
ConnectStrChanged?.Invoke(null, EventArgs.Empty);
//StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(nameof(_connectstr)));
}
}
现在可以在初始化阶段以外更新静态变量ConnectStr的值到界面中。