0

因此,我创建了一个 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 始终为空。我是否错过了某个地方对 PropertyChanged 的​​订阅?

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

4

2 回答 2

3

问题在于第一次提取 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;
 }
于 2012-07-25T16:14:10.187 回答
1

我相信这与没有设置DataContext你的有关,ViewTreeClass因为我真的没有看到代码有任何其他错误。尝试DataContext在方法开始时将 设置为单例类addStuff()。此外,虽然与您的问题相切,但我真的建议您在控件的 XAML 的部分类中执行您正在执行的操作,因为以编程方式创建绑定通常非常混乱。

于 2012-07-25T16:07:30.070 回答