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

Det*_*yne 8 c# wpf

我首先要说的是我对Binding很新.我已经在WPF中做过一些事情,但我从未使用过绑定因为概念对于我而言有点太难理解了.即便如此,我现在正在做的是我设法从一个我不完全理解的教程中挽救的东西.

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

例:

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


    public static void ChangeTheme()
    {
        property = Brushes.Blue;
    }
}
Run Code Online (Sandbox Code Playgroud)

在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"/>
Run Code Online (Sandbox Code Playgroud)

当应用程序加载时,它将加载正确的设置(红色)但是当事情发生变化并调用ChangeTheme()时,静态类将获得新值,但文本框的背景不会改变.我在这做错了什么?正如我所说,我对此非常陌生,我很欣赏外行人的解决方案.

谢谢!

Cle*_*ens 10

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

public static SolidColorBrush Property { get; set; }
Run Code Online (Sandbox Code Playgroud)

请注意,名称以大写字母开头,这是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

对静态属性的绑定将使用括号中的属性路径写入:

Background="{Binding Path=(style:AppStyle.Property)}"          
Run Code Online (Sandbox Code Playgroud)

  • 不确定.我的期望是绑定也适用于设计视图.这可能值得另一个StackOverflow问题.但是,您可能设置了Binding的FallbackValue. (2认同)