侦听 XAML 中的全局变量更改



>我有一个全局变量,指示我的应用程序是否处于只读模式

public static class Global
{
public static event PropertyChangedEventHandler StaticPropertyChanged;
private static void OnStaticPropertyChanged(string propertyName)
{
StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}
private static bool _isReadOnly = false;
public static bool IsReadOnly
{
get { return _isReadOnly; }
set
{
_isReadOnly = value;
OnStaticPropertyChanged("IsReadOnly");
}
}
}

现在我想在我的所有 GUI 中收听它以关闭编辑。例如,我有一个数据网格

<UserControl xmlns:models="clr-namespace:MyApp.Models" >
<DataGrid IsReadOnly="{Binding Path=(models:Global.IsReadOnly)}"  />
</UserControl>

如何在 ViewModel 中侦听全局变量而不是局部变量?目前我收到错误消息

命名空间"模型"中不存在名称"全局"。

但它确实如此!我已经尝试重新编译并重新启动VS。

您可以使用单一实例实现,而不是使用静态属性。比你有一个实例,可以实现INotifyPropertyChanged

public class Global : INotifyPropertyChanged
{
private Global() { }
public Global Instance { get; } = new Global();
private bool _isReadOnly;
public bool IsReadOnly
{
get => _isReadOnly;
set
{
if (_isReadOnly != value)
{
_isReadOnly = value;
PropertyChanged?.Invoke(this,
new PropertyChangedEventArgs(nameof(IsReadOnly)));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}

然后你可以像这样使用它:

<DataGrid IsReadOnly="{Binding Source={x:Static local:Global.Instance}, Path=IsReadOnly}" />

正如 Clemens 在评论中提到的,从 .Net 4.5 开始,有一个静态的 PropertyChanged 事件也适用于静态属性:

public static event PropertyChangedEventHandler StaticPropertyChanged;

最新更新