【问题标题】:Static binding doesn't update when resource changes资源更改时静态绑定不更新
【发布时间】:2016-01-13 09:30:25
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: c# wpf


    【解决方案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)}"          
    

    【讨论】:

    • 感谢您的深入回复。让我补充一下,我确实使用 {get;set;} 作为我的属性,我只是在我的问题中错过了它。关于您的回答,我还有 1 个问题;我的课程在另一个项目中的 dll 中,我是在那里编写第一个代码块还是在我正在使用的 xaml 的 .cs 中编写?
    • 非常感谢。我已经应用了您的代码,现在一切正常。我会确保记住这一点。再次谢谢你! :)
    • 我还有 1 个问题。现在我在可视化设计视图中使用我的绑定,我的背景是透明的,这使得在没有可见边框的情况下正确排序元素有点困难。有没有办法缓解这种情况?
    • 不确定。我的期望是绑定也适用于设计视图。这可能值得另一个 StackOverflow 问题。但是,您可能会设置 Binding 的 FallbackValue。
    • 如果我这样做,应用程序会使用该值而不是在类字段中定义的值作为后备值加载,出于实际原因,这不是一个好的解决方案。等我回家再写一个问题。也许有一个解决方案。谢谢! :)
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复,不过,Clemens 的回答对我帮助更大。我说我是绑定新手,我不得不说我从来没有听说过你提到的一些词。我知道这个界面,但我不知道如何使用它,因为我还没有深入了解 C#
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多