2017-07-31 63 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