XAML

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

これは既に開いて初期化したGUI。彼らは不動産をリロードするようではありません。 –

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

をコメントにクレメンスで述べたように、純4.5以降静的があります静的プロパティでも動作するPropertyChangedイベント:

public static event PropertyChangedEventHandler StaticPropertyChanged; 
+0

WPF 4.5以降では、WPFバインディングで消費される 'StaticPropertyChanged'イベントを宣言することができるため、これはもう必要ありません。 – Clemens

+0

ありがとう、私はそれを知らなかった:) – JanDotNet