2016-01-13 107 views
6

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

谢谢!

回答

6

首先,你的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) 
    { 
     var handler = StaticPropertyChanged; 
     if (handler != null) 
     { 
      handler(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)}"   
+0

谢谢你的深入答复。让我补充一点,我确实使用{get; set;}来表示我的属性,在我的问题中,我错过了它。我还有1个关于你的答案的问题;我的课程是在另一个项目中的dll中,我是在那里编写第一个代码块还是在我正在使用的xaml的.cs文件中编写代码块? – DethoRhyne

+1

这一切都在类AppStyle中,请参阅我的编辑。 – Clemens

+0

非常感谢。我已经应用了您的代码,现在一切正在运行。我会确保记住这一点。再次谢谢你! :) – DethoRhyne

0

要对变更实施反应,您需要通知变更。请参阅INotifyPropertyChanged接口。但是,您不能将其与静态类一起使用。那么单身人士(理想情况下使用一些依赖注入容器)而不是静态类呢?

+0

谢谢你的回复,但是,克莱门斯的回答帮助了我多一点。我说我是新来的人,我必须说我从来没有听说过你提到过的一些词。我知道接口,但我不知道如何利用它,因为我没有得到那么远的C# – DethoRhyne

相关问题