2017-06-15 18 views
-1

ItemsControlを継承するカスタムコントロールを作成しています。特定のプロパティが変わるたびにメソッドを呼び出す必要があります。私自身の依存関係プロパティのために、私はセッターでこれを問題なく呼び出すことができますが、ItemsSourceのような継承されたものの場合、これを行う方法はわかりません。カスタムコントロール:継承された依存関係プロパティの変更時にメソッドを呼び出す方法

これを検索すると、少なくともWPFのOverrideMetadataを使って(私のプロジェクトはUWPです)、mentionを実行することができました。 OverrideMetadataを使用してデフォルト値を変更する方法がわかりますが、プロパティ変更通知としてどのように使用できるか分かりません。

+0

私はこれが悪い質問である理由について私に手がかりを与えることができるので、私はより多くの評判を失うことはありませんか? –

答えて

4

このためだけに設計されたRegisterPropertyChangedCallbackと呼ばUWPに新しい方法があります:UWPアプリでは、@ThomasレベスクのDependencyPropertyWatcherクラスを使用することができるはずです。たとえば、拡張されたGridViewコントロールで、デフォルトの入口トランジションを削除する方法を次に示します。

// Remove the default entrance transition if existed. 
RegisterPropertyChangedCallback(ItemContainerTransitionsProperty, (s, e) => 
{ 
    var entranceThemeTransition = ItemContainerTransitions.OfType<EntranceThemeTransition>().SingleOrDefault(); 
    if (entranceThemeTransition != null) 
    { 
     ItemContainerTransitions.Remove(entranceThemeTransition); 
    } 
}) 

UnregisterPropertyChangedCallbackを使用して登録を解除できます。

詳細情報はhereです。

+1

mm8が指摘する前に私が気づいていなかったOnItrmsChangedをオーバーライドしていますが、これは他のプロパティの変更に対しては明らかに適切な解決策です。 –

0

ItemsSourceプロパティであなただけのOnItemsSourceChangedメソッドをオーバーライドすることができますが、他の依存関係プロパティのために使用することができDependencyPropertyDescriptor:WPFのために行く

public class MyItemsControl : ItemsControl 
{ 
    public MyItemsControl() 
    { 
     DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor 
      .FromProperty(ItemsControl.ItemsSourceProperty, typeof(ItemsControl)); 
     if (dpd != null) 
     { 
      dpd.AddValueChanged(this, OnMyItemsSourceChange); 
     } 

    } 

    private void OnMyItemsSourceChange(object sender, EventArgs e) 
    { 
     //... 
    } 
} 

https://www.thomaslevesque.com/2013/04/21/detecting-dependency-property-changes-in-winrt/

+0

ありがとう、私はOnItemsChangedについて知らなかった、うまくいきました。もし私がそれを必要とすればトーマス・レベスクを試してみましょう。 –

+1

IMHOネーティブアプローチは、ウォッチャーのバインディングアプローチよりもほんの控え目です(よりパフォーマンス的です)。 –

関連する問題