0

そこで、アプリケーション全体でグローバルに使用される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を実装するシングルトンです。

 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;'を変更すると シングルトン変数を「false」に変更しますが、ToolTipService.EnabledPropertyを「false」に更新せず、PropertyChangedは常にnullです。PropertyChangedのサブスクリプションがどこかにありませんか?

シングルトンと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設定してみてください。また、質問に正接しますが、プログラムでバインドを作成するのは通常かなり面倒なので、コントロールのXAMLの部分クラスで実行していることを実行することをお勧めします。DataContextaddStuff()

于 2012-07-25T16:07:30.070 に答える