【问题标题】:How can I know that some property was binding?我怎么知道某些属性是绑定的?
【发布时间】:2012-02-27 07:55:21
【问题描述】:

我怎么知道某些属性是绑定的? 例如一个属性(从 NotificationObject 实现的类):

public string Title
{
  set
  {
    _title=value;
    this.RaisePropertyChanged(() => this.Title);
  }
  get
  {
    return _title;
  }
}

使用:

<TextBlock Text={Binding Title}>

我需要知道何时没有人使用某个属性来释放 dispose 资源。

【问题讨论】:

    标签: wpf binding properties


    【解决方案1】:

    没有简单的方法可以知道控件是否绑定到 ViewModel 的特定属性,但您可以知道是否有人订阅了 PropertyChanged 事件(只需检查它是否不为空)。绑定引擎订阅此事件,因此如果某些内容绑定到您的 ViewModel 的至少一个属性,PropertyChanged 事件处理程序将不会为空。

    【讨论】:

      【解决方案2】:

      您可以通过设置标志来判断是否有人请求了您的财产,但不确定这是否能满足您的需求:

      private bool _isTitleBound = false;
      
      public string Title
      {
        set
        {
          _title = value;
      
          this.RaisePropertyChanged(() => Title);
        }
        get
        {
          _isTitleBound = true;
      
          return _title;
        }
      }
      

      您还可以考虑延迟实例化,这将导致您的一次性对象仅在调用属性 getter 时创建。如果永远不会调用属性 getter,则永远不会创建一次性对象。此外,如果这是一次性绑定,请考虑使用延迟实例化来处理您的对象。例如:

      public MyThing Thing
      {
        get
        {
          MyThing thing = CreateMyThing();
      
          Dispatcher.CurrentDispatcher.BeginInvoke(
            DispatcherPriority.Background,
            new Action(() => thing.Dispose());
      
          return thing;
        }
      }
      
      private MyThing CreateMyThing()
      {
        //create and return MyThing instance;
      }
      

      【讨论】:

      • 对不起,我不明白,你在这个“MyThing thing = CreateMyThing();”中创建(或获取)对象,并在下一步处理这个对象(事物)?
      • @Ivan 是的,对象将被释放,但优先级低于绑定和渲染,因此应在释放之前绑定和显示。如果它是一次性绑定,即如果它本身没有属性更改通知,这是有意义的。如果这会造成问题,我需要有关您的应用程序如何工作的更多信息。第一个简单的标志解决方案或惰性实例化可能对您有用。
      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2019-10-17
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多