如何在Silverlight中订阅自定义控件内的Attached属性事件?

时间:2011-11-11 21:32:26

标签: c# silverlight xaml mvvm

我正在开发自定义控件,可用于我的应用UI中的互动。所以,我的想法是控件将绑定到具有它的事件的IInteractionsProvider。然后,我将在此提供程序上调用方法,该方法将向我的控件引发事件以执行它需要执行的操作。

问题是,我不知道如何在自定义控件中正确订阅事件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");
                }
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

要附加依赖项属性上的事件(或者在分配了依赖项属性时执行任何操作,可以使用PropertyMetadata上的回调委托。

    public static readonly DependencyProperty InteractionsProviderProperty = 
        DependencyProperty.Register("InteractionsProvider", typeof(IInteractionsProvider), typeof(IdattInteractions), new PropertyMetadata(null, OnInteractionsProviderPropertyChanged)); 

    private static void OnInteractionsProviderPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

         var source = d As MyInteractions;
         if (source ! = null)
         {
             var oldValue = (IInteractionsProvider)e.OldValue;
             var newValue = (IInteractionsProvider)e.NewValue;
             source.OnInteractionsProviderPropertyChanged(oldValue, newValue);
         }
    }
    private void OnInteractionsProviderPropertyChanged(IInteractionsProvider oldValue, IInteractionsProvider newValue)
    {
         if (oldValue != null)
              oldValue -= InteractionsProvider_InteractionRequested;

         if (newValue != null)
              newValue += InteractionsProvider_InteractionRequested;
    }
    private void InteractionsProvider_InteractionRequested(object sender, EventArgs e)
    {
        // Do Stuff
    }

答案 1 :(得分:0)

这是你在找什么?

public IInteractionsProvider InteractionsProvider 
{ 
    get { return (IInteractionsProvider)GetValue(InteractionsProviderProperty); } 
    set {
        var oldValue = this.InteractionsProvider;
        if (oldValue != null)
            oldValue.InteractionRequested -= this.HandleInteractionRequested;
        if (value != null)
            value.InteractionRequested += this.HandleInteractionRequested;
        this.SetValue(InteractionsProviderProperty, value);
    } 
} 

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