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
にバインドした場合、それは現在の値で正しく更新されます。
現在DependencyProperty
Value
のSlider
は、フォントサイズを更新するためにこのプロパティにバインドされています。 (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);
}
。 – Blacktempel
NotifyStaticPropertyChangedメソッドはどのように実装されていますか? – mm8
@ mm8「通常の」実装と似ています。私の編集を参照してください。 – Blacktempel