2017-07-31 110 views
1

我有一个全局变量,指示是否我的应用程序在只读模式听全局变量变化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关闭编辑。例如我有一个DataGrid

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

我怎么可以听我的ViewModel中的全局变量而不是本地的?目前,我收到错误消息

名称Global不存在于名称空间模型中。

但它呢!我已经尝试重新编译并重新启动VS.

+0

这对我已经打开并初始化不起作用图形用户界面。他们似乎没有重新加载该财产。 –

+1

什么不能用于StaticPropertyChanged方法?您是否使用4.5之前的WPF版本?请分享您的代码。 – Clemens

+0

你确定'Global'实际上是'MyApp.Models'命名空间的成员吗? – Clemens

回答

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

正如在评论中提到的克莱门斯,因为.NET 4.5有一个静态PropertyChanged事件,也适用于静态属性:

public static event PropertyChangedEventHandler StaticPropertyChanged; 
+0

由于WPF 4.5已不再需要,因为您可以声明WPF绑定使用的'StaticPropertyChanged'事件。 – Clemens

+0

谢谢,我不知道那一个:) – JanDotNet