Я провел последние часы, пытаясь найти ответ в google и stackoverflow. Я пошел по разным советам &, но ничего не получилось. Мой текущий код выглядит следующим образом:Статическое свойство не обновляется в 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
работает, и мой пользовательский интерфейс не обновляется. Я добавил TextBlock
, чтобы проверить, обновляется ли он. По-видимому, это не так.
<TextBlock Text="{Binding Path=(global:GlobalManager.GlobalFontSize), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Если я определяю свойство в моей виртуальной машине (текущий DataContext), и привязать его к TextBlock
, он правильно обновляется с текущим значением.
В настоящее время DependencyProperty
Value
Slider
связан с этим имуществом для того, чтобы уточнить размер шрифта. (IsSnapToTickEnabled="True"
)
public double GlobalFontSize
{
get { return GlobalManager.GlobalFontSize; }
set { GlobalManager.GlobalFontSize = value; NotifyPropertyChanged(() => GlobalFontSize); }
}
Как получить привязки для корректной работы со статическим свойством? Событие StaticPropertyChanged
не равно нулю.
StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
Edit 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);
}
@ MM8 'Случай StaticPropertyChanged не null.' Моя подпись верна. – Blacktempel
Как реализован метод NotifyStaticPropertyChanged? – mm8
@ mm8 Как «нормальная» реализация. См. Мое редактирование. – Blacktempel