私は、自分のアプリのUI内でインタラクションに使用できるカスタムコントロールに取り組んでいます。ですから、私の考えは、コントロールがイベントを持つIInteractionsProvider
にバインドされるということです。そして、私はこのプロバイダーのメソッドを呼び出すことになります。このメソッドは、必要な処理を行うためにコントロールをイベントに発生させます。Silverlightでカスタムコントロール内の添付プロパティのイベントを購読するには?
問題は、カスタムコントロール内のイベントInteractionRequired
を正しく購読する方法がわかりません。
基本的に、私はイベントを正しくフックしたり、フックを外したり、コントロールの中でいつどのようにコントロールするか分かりません。
public interface IInteractionsProvider
{
event EventHandler InteractionRequested;
void RequestInteraction(Action<object> callback);
}
public class MyInteractions : Control
{
public static readonly DependencyProperty ContainerProperty =
DependencyProperty.Register("Container", typeof(Grid), typeof(IdattInteractions), new PropertyMetadata(null));
public static readonly DependencyProperty InteractionsProviderProperty =
DependencyProperty.Register("InteractionsProvider", typeof(IInteractionsProvider), typeof(IdattInteractions), new PropertyMetadata(null));
public IdattInteractions()
{
DefaultStyleKey = typeof(MyInteractions);
}
public Grid Container
{
get { return GetValue(ContainerProperty) as Grid; }
set { this.SetValue(ContainerProperty, value); }
}
public IInteractionsProvider InteractionsProvider
{
get { return (IInteractionsProvider)GetValue(InteractionsProviderProperty); }
set { this.SetValue(InteractionsProviderProperty, value); }
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
if (System.ComponentModel.DesignerProperties.IsInDesignTool) return;
if (this.InteractionsProvider == null)
{
throw new NotSupportedException("InteractionsProvider wasn't specified. If you don't need interactions on this view - please remove MyInteractions from XAML");
}
if (this.Container != null)
{
if (this.Container.GetType() != typeof(Grid))
{
throw new NotSupportedException("Specified container must be of Grid type");
}
}
else
{
this.Container = TreeHelper.FindParentGridByName(this, "LayoutRoot") ?? TreeHelper.FindParent<Grid>(this);
if (this.Container == null)
{
throw new NotSupportedException("Container wasn't specified and parent Grid wasn't found");
}
}
}
}
phoogの提案はどうですか?私はそのアプローチが気に入っているのではないかと思います。 – katit
@katit:その答えに私のコメントを参照してください – AnthonyWJones
ありがとう!彼のnewValueは価値があるはずです。そして、あなたの例の依存関係プロパティの宣言では、OnInteractionsProviderPropertyChangedではなくOnInteractionsProviderPropertyでなければならないと思いますか? – katit