8

バインディングで使用できる UpdateSourceTrigger のカスタム バージョンを作成しようとしています。これが可能かどうかはわかりませんが、代わりに、独自のバインディング クラスを作成する必要があります。私が探しているのは、LostFocus または PropertyChanged の代わりに、指定された制限時間後にソースを更新するものがあることです。

私はこれを見つけましが、より良い方法があるかどうかはわかりません (コメントの 1 つで、実装でのメモリ リークが言及されていました)。

何か案は?

4

3 に答える 3

19

WPF 4.5 に遅延プロパティがあることに気付きました。詳細については、このリンクを参照してください。

http://www.shujaat.net/2011/12/wpf-45-developers-preview-delay-binding.html

于 2012-07-04T12:19:57.740 に答える
5

バインディング レベルでこれを行うことは気にしませんが、代わりにビュー モデルで明示します。プロパティが変更されたら、DispatcherTimer を再起動します。タイマーが切れたら、ロジックを開始します。それはとても簡単です。

于 2011-11-04T18:11:11.493 に答える
0

これは、Reactive Extensions の Throttle() メソッドを観察可能なプロパティと組み合わせて使用​​することで簡単に実装できます。

public class ObservablePropertyBacking<T> : IObservable<T>
{
  private readonly Subject<T> _innerObservable = new Subject<T>();

  private T _value;

  public T Value
  {
    get { return _value; }
    set
    {
      _value = value;
      _innerObservable.OnNext(value);
    }
  }

  #region IObservable<T> Members

  public IDisposable Subscribe(IObserver<T> observer)
  {
    return _innerObservable
      .DistinctUntilChanged()
      .AsObservable()
      .Subscribe(observer);
  }

  #endregion
}

次のように使用します。

// wire query observable
var queryActual = new ObservablePropertyBacking<string>();
queryActual.Throttle(TimeSpan.FromMilliseconds(300)).Subscribe(DoSearch);

実装プロパティ:

string query;

public string Query
{
  get { return query; }
  set
  {
    queryActual.Value = value;
  }
}
于 2011-11-04T18:44:51.383 に答える