静态属性未在 UI 中更新

2024-04-23

我花了最后一个小时试图在谷歌和 stackoverflow 中找到答案。我遵循了不同的意见和建议,但到目前为止没有任何效果。我当前的代码如下所示:

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);
                }
            }
        }
    }
}

getter 和 setter 都被调用。NotifyStaticPropertyChanged有效,但我的用户界面没有更新。我添加了一个TextBlock检查它是否更新。显然事实并非如此。

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

如果我在 VM(当前 DataContext)中定义一个属性,并将其绑定到TextBlock,它会使用当前值正确更新。

目前DependencyProperty Value of a Slider绑定到此属性以更新字体大小。 (IsSnapToTickEnabled="True")

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

如何使绑定与静态属性一起正常工作?The 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);
}

确保您的GetGlobalResource and SetGlobalResource方法按预期工作,并且您的事件签名正确。

您可以参考下面的工作示例实现并将其与您的进行比较:

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);
    }
}

Edit:但如果事件是在基类中定义的,则它不起作用。

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");
                }
            }
        }
    }
}

The StaticPropertyChangedEvent必须在属性所在的同一类中定义才能更新绑定:

静态属性值更改时视图未收到通知 https://stackoverflow.com/questions/22346212/view-is-not-getting-notified-when-value-of-static-property-changes

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态属性未在 UI 中更新 的相关文章

随机推荐