静态绑定不会';当资源更改时不会更新

本文关键字:更新 资源 静态绑定 | 更新日期: 2023-09-27 18:30:02

我首先想说的是,我对绑定非常陌生。。我已经在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()时,静态类将获得新值,但文本框的背景不会改变。我在这里做错了什么?正如我所说,我对这一点很陌生,我很感激用外行的话来说的解决方案。

谢谢!

静态绑定不会';当资源更改时不会更新

首先,property实际上不是一个属性,而是一个字段。最小属性声明如下所示:

public static SolidColorBrush Property { get; set; }

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

因为您还希望在属性值更改时触发更改通知,所以需要声明属性更改事件(对于非静态属性,通常通过实现INotifyPropertyChanged接口来完成)。

对于静态属性,WPF4.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)}"          

要实现对更改的反应,您需要通知更改。请参阅INotifyPropertyChanged接口。但是,您不能将它与静态类一起使用。单例(最好使用一些依赖注入容器)而不是静态类呢?