聆听XAML中的全局变量更改

时间:2017-07-31 19:07:50

标签: c# wpf xaml mvvm .net-4.6.1

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

git checkout-index

现在我想在我的所有GUI中听一下关闭编辑。例如,我有一个DataGrid

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");
        }
    }
}

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

  

命名空间名称Global不存在于名称空间Models中。

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

1 个答案:

答案 0 :(得分:3)

您可以使用单例实现,而不是使用静态属性。比你有一个实例,可以实现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;