簡體   English   中英

靜態屬性未在UI中更新

[英]Static property not updating in UI

我花了最后一個小時試圖在google和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 ,則它將使用當前值正確更新。

當前, SliderDependencyProperty Value已綁定到此屬性,以更新字體大小。 IsSnapToTickEnabled="True"

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

如何使綁定與static屬性一起正常工作? 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);
}

確保您的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 ,以使綁定得以更新:

靜態屬性值更改時,視圖未收到通知

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM