Another implementation of WPF Event to Command (with problems)

后端 未结 3 1003
一整个雨季
一整个雨季 2021-01-14 22:08

I am looking at various implementations of hooking a ICommand up to a control\'s event. So for instance the GotFocus of a TextBox should call a GotFocusCommand in my View Mo

3条回答
  •  时光说笑
    2021-01-14 22:49

    There are a couple of ways you could approach this, either using an Attached Property or inheriting from Button and adding your own DependencyProperty that contains a list of EventToCommand objects, and when you add to that collection you wire up the event to command. If this seems confusing, I can try to whip up some examples.

    C#

        public class EventedButton : Button
    {
        public static DependencyProperty EventCommandsProperty
            = DependencyProperty.Register("EventCommands", typeof(EventToCommandCollection), typeof(EventedButton), new PropertyMetadata(null));
    
    
        public EventToCommandCollection EventCommands
        {
            get
            {
                return this.GetValue(EventCommandsProperty) as EventToCommandCollection;
            }
            set
            {
                this.SetValue(EventCommandsProperty, value);
            }
        }
    
        public EventedButton()
        {
            this.EventCommands = new EventToCommandCollection(this);
        }
    }
    

    Xaml:

        
            
                
            
        
    

    Inside of EventToCommandCollection, you would attach/detach to the Event you wanted when items are added to the collection.

    UPDATE: Attached Property

    Here is some code to do the collection as an attached property:

    C#

            public static DependencyProperty CommandsProperty =
            DependencyProperty.RegisterAttached(
            "Commands",
            typeof(ICollection),
            typeof(DependencyObject),
            new PropertyMetadata(null, OnCommandsChanged));
    
    
        private static void OnCommandsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            // Attach/Detach event handlers
        }
    
        public static void SetCommands(DependencyObject element, ICollection value)
        {
            element.SetValue(CommandsProperty, value);
        }
    
        public static ICollection GetCommands(DependencyObject element)
        {
            return (ICollection)element.GetValue(CommandsProperty);
        }
    

    Xaml:

        
            
                
                    
                
            
        
    

提交回复
热议问题