一尘不染

资源更改时,静态绑定不会更新

c#

我首先要说我对Binding还是很陌生。.我已经在WPF中做过一些事情,但是我从未使用过绑定,因为对于我而言,概念对于我来说有点太难理解了。即使是我现在正在做的事情,我也从我不完全了解的教程中得以解决。

在我的应用程序中,我有一个带有静态属性的静态类,并且有一个更改这些静态属性的静态方法。

例:

public static class AppStyle
{
    public static SolidColorBrush property = Brushes.Red;


    public static void ChangeTheme()
    {
        property = Brushes.Blue;
    }
}

在XAML内部,我有一个控件,该控件的背景绑定到该值。我什至正确地声明了名称空间。

...
    xmlns:style="clr-namespace:CorrectNamespace;assembly=RightAssembly"
...
<TextBox x:Name="TXT_PN" 
     Background="{Binding Source={x:Static style:AppStyle.property}}"          
     TextChanged="TXT_PN_TextChanged" 
     Text="Text"/>

当应用程序加载时,它将加载正确的设置(红色),但是当事物发生变化并调用ChangeTheme()时,静态类将获得新值,但是文本框的Background不会改变。我在这里做错了什么?正如我所说的,我对此很陌生,对于外行的解决方案,我将不胜感激。

谢谢!


阅读 352

收藏
2020-05-19

共1个答案

一尘不染

首先,您property实际上不是财产,而是领域。最小的属性声明如下所示:

public static SolidColorBrush Property { get; set; }

请注意,该名称以大写字母开头,这是C#中广泛接受的编码约定。

因为您还希望每当属性值更改时都发出更改通知,因此您需要声明一个属性更改的事件(对于非静态属性,通常通过实现INotifyPropertyChanged接口来完成)。

对于静态属性,WPF 4.5(或4.0?)中提供了一种新机制,您可以在其中编写如下的静态属性更改事件和属性声明:

public static class AppStyle
{
    public static event PropertyChangedEventHandler StaticPropertyChanged;

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

    private static SolidColorBrush property = Brushes.Red; // backing field

    public static SolidColorBrush Property
    {
        get { return property; }
        set
        {
            property = value;
            OnStaticPropertyChanged("Property");
        }
    }

    public static void ChangeTheme()
    {
        Property = Brushes.Blue;
    }
}

与静态属性的绑定将用括号中的属性路径编写:

Background="{Binding Path=(style:AppStyle.Property)}"
2020-05-19