2017-02-08 15 views
0

Googleとstackoverflowで回答を検索しようとした最後の1時間を費やしました。私は別のアドバイス&の提案に従ったが、これまでのところ何も働かなかった。私の現在のコードは次のようになります。UI内で静的プロパティが更新されない

public class GlobalManager : ViewModelBase 
{ 
    static object _LockObject_GFS = new object(); 
    static double _GlobalFontSize; 
    public static double GlobalFontSize 
    { 
     get 
     { 
      lock (_LockObject_GFS) 
      { 
       _GlobalFontSize = GetGlobalResource<double>(LambdaHelper.MemberToString(() => GlobalFontSize)); 
       return _GlobalFontSize; 
      } 
     } 
     set 
     { 
      lock (_LockObject_GFS) 
      { 
       if (_GlobalFontSize != value) 
       { 
        _GlobalFontSize = value; 
        SetGlobalResource(value, LambdaHelper.MemberToString(() => GlobalFontSize)); 
        NotifyStaticPropertyChanged(() => GlobalFontSize); 
       } 
      } 
     } 
    } 
} 

ゲッター&セッターは両方と呼ばれています。 NotifyStaticPropertyChangedが動作し、UIが更新されません。更新するかどうか確認するためにTextBlockを追加しました。明らかにそうではありません。

<TextBlock Text="{Binding Path=(global:GlobalManager.GlobalFontSize), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

私は私のVM(現在のDataContext)でプロパティを定義し、TextBlockにバインドした場合、それは現在の値で正しく更新されます。

現在DependencyPropertyValueSliderは、フォントサイズを更新するためにこのプロパティにバインドされています。 (IsSnapToTickEnabled="True"

public double GlobalFontSize 
{ 
    get { return GlobalManager.GlobalFontSize; } 
    set { GlobalManager.GlobalFontSize = value; NotifyPropertyChanged(() => GlobalFontSize); } 
} 

は、どのように私は静的プロパティで正しく動作するように結合できますか? StaticPropertyChangedイベントはnullではありません。

StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName)); 

編集1:

public static void NotifyStaticPropertyChanged(string propertyName) 
{ 
    StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName)); 
} 

public static void NotifyStaticPropertyChanged<T>(Expression<Func<T> > property) 
{ 
    var expr = property.Body as MemberExpression; 
    if (expr == null) 
     throw new ArgumentException("Lambda does not contain member expression.() => MyClassOrObject.Property"); 
    NotifyStaticPropertyChanged(expr.Member.Name); 
} 
+0

。 – Blacktempel

+0

NotifyStaticPropertyChangedメソッドはどのように実装されていますか? – mm8

+0

@ mm8「通常の」実装と似ています。私の編集を参照してください。 – Blacktempel

答えて

1

期待して、イベントの署名が正しいこととしてあなたGetGlobalResourceSetGlobalResourceメソッドが動作することを確認してください。

あなたは、以下の作業のサンプルの実装を参照し、あなたにそれを比較することができます:

public class GlobalManager 
{ 
    static object _LockObject_GFS = new object(); 
    static double _GlobalFontSize; 
    public static double GlobalFontSize 
    { 
     get 
     { 
      lock (_LockObject_GFS) 
      { 
       return _GlobalFontSize; 
      } 
     } 
     set 
     { 
      lock (_LockObject_GFS) 
      { 
       if (_GlobalFontSize != value) 
       { 
        _GlobalFontSize = value; 
        NotifyStaticPropertyChanged(()=> GlobalFontSize); 
       } 
      } 
     } 
    } 

    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; 

    public static void NotifyStaticPropertyChanged(string propertyName) 
    { 
     StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName)); 
    } 

    public static void NotifyStaticPropertyChanged<T>(Expression<Func<T>> property) 
    { 
     var expr = property.Body as MemberExpression; 
     if (expr == null) 
      throw new ArgumentException("Lambda does not contain member expression.() => MyClassOrObject.Property"); 
     NotifyStaticPropertyChanged(expr.Member.Name); 
    } 
} 

は編集:イベントはいえ、基本クラスで定義されている場合、それは動作しません。

public abstract class MyBaseViewModel 
{ 
    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged; 

    public static void NotifyStaticPropertyChanged(string propertyName) 
    { 
     StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName)); 
    } 

    public static void NotifyStaticPropertyChanged<T>(Expression<Func<T>> property) 
    { 
     var expr = property.Body as MemberExpression; 
     if (expr == null) 
      throw new ArgumentException("Lambda does not contain member expression.() => MyClassOrObject.Property"); 
     NotifyStaticPropertyChanged(expr.Member.Name); 
    } 
} 

public class GlobalManager : MyBaseViewModel 
{ 
    static object _LockObject_GFS = new object(); 
    static double _GlobalFontSize = 10.0; 
    public static double GlobalFontSize 
    { 
     get 
     { 
      lock (_LockObject_GFS) 
      { 
       return _GlobalFontSize; 
      } 
     } 
     set 
     { 
      lock (_LockObject_GFS) 
      { 
       if (_GlobalFontSize != value) 
       { 
        _GlobalFontSize = value; 
        NotifyStaticPropertyChanged("GlobalFontSize"); 
       } 
      } 
     } 
    } 
} 

プロパティが更新されますとの結合のために存在する場所StaticPropertyChangedEventは同じクラスで定義しなければなりません: `StaticPropertyChangedイベントは私の署名が正しいnull.` MM8ではありません@

View is not getting notified when value of static Property Changes

+0

'VM(現在のDataContext)にプロパティを定義してTextBlockにバインドすると、現在の値で正しく更新されます.'これらのGet/Set-GlobalResourceメソッドは機能します。それ以外に、基本クラスまたは静的プロパティ自体のクラスで 'StaticPropertyChanged'イベントがあると、違いがありますか? – Blacktempel

+0

"StaticPropertyChangedイベントが基本クラスまたは静的プロパティ自体のクラスにある場合は違いがありますか?"はい、そうです。 – mm8

+1

奇妙ですが、よく...私はクラスを最小限に抑えます。ありがとうございました。 – Blacktempel

関連する問題