2017-08-29 153 views
-1

"もっと読み込みをスクロールする"機能を実装したいと思います。 ScrollViewerのverticalOffsetプロパティが変更されたかどうかを確認するために、カスタムバインディングが添付されています。 ListBoxの読み込みにバインディングを登録するには、次のコードを使用します。"ListenerOffset"プロパティは既に "UserControl"によって登録されていました。

public static ScrollViewer scrollViewer; 
public static DependencyProperty offsetChangeListener; 
public static Binding binding; 

private void initScrollViewerMonitor(object sender, RoutedEventArgs e) 
{ 
    //get the ScrollViewer from the ListBox 
    scrollViewer = GetDescendantByType(accountHistoryList, typeof(ScrollViewer)) as ScrollViewer; 


    //attach to custom binding to check if ScrollViewer verticalOffset property has changed 
    if (binding == null || offsetChangeListener == null) 
    { 
     var binding = new Binding("VerticalOffset") { Source = scrollViewer }; 
     offsetChangeListener = DependencyProperty.RegisterAttached(
           "ListenerOffset", 
           typeof(object), 
           typeof(UserControl), 
           new PropertyMetadata(OnScrollChanged)); 
     scrollViewer.SetBinding(offsetChangeListener, binding); 
    } 
} 

しかし、ListBoxの2回目に再ロードされると、次のエラーが表示されます。

System.ArgumentExceptionの: '' ListenerOffset 'プロパティは、既に "ユーザーコントロール" によって登録 ました'。

アンロード時に登録を解除できますか?

+0

するDependencyPropertyフィールドは静的である必要があり、そのほかに、ListenerOffset依存関係プロパティのバッキングフィールドがListenerOffsetProperty命名されなければならない義務的な命名規則もあります。[カスタム依存関係のプロパティ](https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/custom-dependency-properties)と[添付プロパティの概要](https://docs.microsoft)をよく読んでください。 .com/en-us/dotnet/framework/wpf/advanced /添付プロパティの概要)。 – Clemens

答えて

-1

何が起こっているのかは、Dependency Propertyが同じ名前と所有者で複数回登録されていることです。依存関係プロパティは単一の所有者を持つように意図されており、静的にインスタンス化する必要があります。それらを静的にインスタンス化しないと、コントロールのインスタンスごとにそれらを登録しようとします。

public static DependencyProperty offsetChangeListener = DependencyProperty.RegisterAttached(
           "ListenerOffset", 
           typeof(object), 
           typeof(UserControl), 
           new PropertyMetadata(OnScrollChanged)); 

またRegisterAttached(OWNERTYPE)に「typeof演算(ユーザーコントロール)、」実際の制御ではない、そのベースclass.Theあるべき三番目のパラメータをチェックし、トップ(ない内部機能)上のDependencyPropertyに宣言が静的必要がありますしてください常にそのプロパティを宣言するクラスになります。

-1

依存関係プロパティは静的に割り当てる必要があり、インスタンスベースではありません。プロパティはすでにタイプUserControlで登録されているという例外があります。

あなたのクラスでのpublic static読み取り専用フィールドの値 を設定するために使用されるべき依存関係プロパティ識別子。その識別子は であり、プログラムの値の設定やメタデータの取得などの操作 の場合は、後で依存関係プロパティを参照するために使用されます。 MSDN

今私は、しかし、あなたはif(binding == null) { ... }をチェックしているが、あなたはvar binding下ダウン定義されている、あなたが添付プロパティをチェックしている見ることができます。 var ..は、クラス変数bindingを使用していない新しい変数bindingを作成しています。したがって、var binding is not equal to binding ...これは、あなたのインスタンスでは無関係かもしれません。

基本的には、offsetChangeListenerstatic readonlyのようなプロパティを作成することです。

static readonly DependencyProperty offsetChangeListener = DependencyProperty.RegisterAttached("ListenerOffset", 
                           typeof(object), 
                           typeof(UserControl), 
                           new PropertyMetadata(OnScrollChanged)); 

は今、あなたはあなたが一度だけ、それを登録していることを確認することができ、あなただけのinit段階で登録した場合、あなたは(つまり、コンストラクタなど)が結合を登録している天気を追跡する必要があります。

private void initScrollViewerMonitor(object sender, RoutedEventArgs e) 
{ 
    var binding = new Binding("VerticalOffset") { Source = scrollViewer }; 
    scrollViewer.SetBinding(offsetChangeListener, binding); 
} 
関連する問題