初始定义和绑定后,Singleton INotifyPropertyChanged不会更改

时间:2012-07-25 14:04:14

标签: c# wpf singleton inotifypropertychanged

因此,我创建了一个Singleton,用于跟踪整个应用程序中全局使用的ToolTip启用程序,但是当我尝试将其绑定到ToolTip时,它最初会绑定该值,但是当我更改ToolTip时启用程序值,绑定不会更新。

这是用于创建工具提示绑定的用户控件:

 public partial class ViewTreeClass : UserControl {
      private void addStuff() {
           EnvironmentalVariables.Instance.ToolTipEnable = true;
           Binding bind = new Binding() {
                Source = EnvironmentalVariables.Instance.ToolTipEnable,
           };
           ToolTip x = new ToolTip();
           x.Content = "This is text";
           user.SetBinding(ToolTipService.IsEnabledProperty, bind);
           user.ToolTip = x;
           EnvironmentalVariables.Instance.ToolTipEnable = false;
           // Executing the above statement changes the variable, but ToolTipService.IsEnabledProperty does not change to reflect EnvironmentalVariables.Instance.ToolTipEnable
      }
 }

这是实现INotifyPropertyChanged的Singleton:

 public class EnvironmentalVariables : INotifyPropertyChanged {
      private static EnvironmentalVariables instance = new EnvironmentalVariables();
      public static EnvironmentalVariables Instance {
           get {
                if(instance == null) {
                     instance = new EnvironmentalVariables();
                }
                return instance;
           }
      }

      private EnvironmentalVariables() { }

      private bool tooltipEnable;
      public bool ToolTipEnable {
           get {
                return tooltipEnable;
           }
           set {
                if(tooltipEnable != value) {
                     tooltipEnable = value;
                     this.RaiseNotifyPropertyChanged("ToolTipEnable");
                }
           }
      }

      private void RaiseNotifyPropertyChanged(string property) {
           if(PropertyChanged != null) {
                PropertyChanged(this, new PropertyChangedEventArgs(property));
           }
      }

      public event PropertyChangedEventHandler PropertyChanged;
 }

当我更改' EnvironmentalVariables.Instance.ToolTipEnable = false;'它将Singleton变量更改为' false'但它没有将ToolTipService.EnabledProperty更新为' false'和PropertyChanged始终为null。我错过了某处PropertyChanged的订阅吗?

Singleton和UC都在不同的名称空间/类文件中。

2 个答案:

答案 0 :(得分:2)

问题在于第一次提取IMO,即创建绑定的方式。什么类型是user

Instance设为来源,将ToolTipEnable设为路径(bind.Path = new PropertyPath("ToolTipEnable"))。

并且您有理由使用ToolTipService.IsEnabledProperty代替ToolTip.IsEnabledProperty吗?我不确定这是这个技巧的好地方(但我可能错了,试试两个^^)。

您的单身人士错了(但不会导致问题)。我也纠正了你举办活动的方式:

 public sealed class EnvironmentalVariables : INotifyPropertyChanged {
      private static readonly EnvironmentalVariables instance = new EnvironmentalVariables();
      public static EnvironmentalVariables Instance {
           get 
           {
               return instance;
           }
      }

      private EnvironmentalVariables() { }

      private bool tooltipEnable;
      public bool ToolTipEnable {
           get {
                return tooltipEnable;
           }
           set {
                if(tooltipEnable != value) {
                     tooltipEnable = value;
                     this.RaiseNotifyPropertyChanged("ToolTipEnable");
                }
           }
      }

      private void RaiseNotifyPropertyChanged(string property) {
           var handler = PropertyChanged;
           if(handler != null) {
                handler (this, new PropertyChangedEventArgs(property));
           }
      }

      public event PropertyChangedEventHandler PropertyChanged;
 }

答案 1 :(得分:1)

我认为这与未设置DataContext的{​​{1}}有关,因为我没有看到代码中的任何其他错误。尝试在ViewTreeClass方法的开头将DataContext设置为单例类。另外,尽管与你的问题相关,但我真的建议你在控件的XAML中执行你在部分类中所做的事情,因为以编程方式创建绑定通常会非常混乱。