C# 静态绑定不';当资源更改时,无法更新

C# 静态绑定不';当资源更改时,无法更新,c#,wpf,C#,Wpf,首先我想说我对装订很陌生。。我已经在WPF中做了一些事情,但我从未使用过绑定,因为这个概念对我来说太难理解了。即使是这样,我现在所做的是我从一个我没有完全理解的教程中设法挽救出来的东西 在我的应用程序中,我有一个具有静态属性的静态类,还有一个静态方法可以更改这些静态属性 例如: public static class AppStyle { public static SolidColorBrush property = Brushes.Red; public static v

首先我想说我对装订很陌生。。我已经在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"/>
。。。
xmlns:style=“clr命名空间:CorrectNamespace;assembly=RightAssembly”
...
当应用程序加载时,它将加载正确的设置(红色),但是当情况发生变化并调用ChangeTheme()时,静态类将获得新值,但是文本框的背景不会改变。 我做错了什么?正如我所说的,我对这一点非常陌生,我希望用外行的话来解释这个问题


谢谢大家!

要对变更做出反应,您需要通知变更。请参阅INotifyPropertyChanged接口。但是,不能将其用于静态类。一个单例(理想情况下使用一些依赖注入容器)而不是一个静态类怎么样?

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

public static SolidColorBrush Property { get; set; }
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;
    }
}
请注意,名称以大写字母开头,这是C#中广泛接受的编码约定

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

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

public static SolidColorBrush Property { get; set; }
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)}"          

感谢您的深入回复。让我补充一下,我确实使用{get;set;}作为我的属性,我只是在我的问题中遗漏了它。关于你的回答,我还有一个问题;我的类在另一个项目中的dll中,我是在那里编写第一个代码块还是在我正在使用的xaml的.cs中编写?非常感谢。我已经应用了你的代码,现在一切正常。我一定要记住这一点。再次感谢你!:)我还有一个问题。现在我在VisualDesign视图中使用绑定,我的背景是透明的,这使得在没有可见边框的情况下正确排序元素有点困难。有没有办法减轻这种情况?不确定。我的期望是,该绑定也可以在设计视图中工作。这可能值得再问一个问题。但是,您可能会设置绑定的回退值。如果我这样做,应用程序将使用该值加载,而不是将类字段中定义的值作为回退值加载,由于实际原因,这不是一个好的解决方案。我到家后再写一个问题。也许有解决办法。谢谢!:)谢谢你的回复,不过,克莱门斯的回答对我帮助更大了。我说我对装订是新手,我必须说我从来没有听说过你提到的一些词。我知道这个接口,但我不知道如何使用它,因为我还没有深入到C#