Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 聆听XAML中的全局变量更改_C#_Wpf_Xaml_Mvvm_.net 4.6.1 - Fatal编程技术网

C# 聆听XAML中的全局变量更改

C# 聆听XAML中的全局变量更改,c#,wpf,xaml,mvvm,.net-4.6.1,C#,Wpf,Xaml,Mvvm,.net 4.6.1,我有一个全局变量,指示我的应用程序是否处于只读模式 public static class Global { public static event PropertyChangedEventHandler StaticPropertyChanged; private static void OnStaticPropertyChanged(string propertyName) { StaticPropertyChanged?.Invoke(null, n

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

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中听一下,以关闭编辑。例如,我有一个DataGrid

<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}" />

这不适用于我已经打开和初始化的GUI。他们似乎没有重新加载属性。什么东西不适合StaticPropertyChanged方法?您是否使用4.5之前的WPF版本?请共享您的代码。您确定
Global
实际上是
MyApp.Models
命名空间的成员吗?我已将您的代码粘贴到新的WPF项目中,它可以正常工作。不知道你这边出了什么问题。@Clemens:找到了。命名空间是正确的,但该类位于另一个程序集中。将其更改为
xmlns:models=“clr namespace:MyApp.models;assembly=MyAppInterfaces”
起作用。由于WPF 4.5不再需要,因为您可以声明一个
StaticPropertyChanged
事件,该事件由WPF绑定使用。谢谢,我不知道这个:)
public static event PropertyChangedEventHandler StaticPropertyChanged;