利用System.Windows.Interactivity.dll实现View时间在ViewModel中处理(可带sender、EventArgs参数)

一、公共类
namespace Gh.Ticket.Common

{

    public class ExtendedCommandParameter

    {

        public ExtendedCommandParameter(EventArgs eventArgs, FrameworkElement sender, object parameter)

        {

            EventArgs = eventArgs;

            Sender = sender;

            Parameter = parameter;

        }

        public EventArgs EventArgs { getprivate set; }

        public FrameworkElement Sender { getprivate set; }

        public object Parameter { getprivate set; }

    }

    public class ExtendedInvokeCommandAction : TriggerAction<FrameworkElement>

    {

        public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command"typeof(ICommand), typeof(ExtendedInvokeCommandAction), new PropertyMetadata(null, CommandChangedCallback));

        public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter"typeof(object), typeof(ExtendedInvokeCommandAction), new PropertyMetadata(null, CommandParameterChangedCallback));

        private static void CommandParameterChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)

        {

            var invokeCommand = d as ExtendedInvokeCommandAction;

            if (invokeCommand != null)

                invokeCommand.SetValue(CommandParameterProperty, e.NewValue);

        }

        private static void CommandChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)

        {

            var invokeCommand = d as ExtendedInvokeCommandAction;

            if (invokeCommand != null)

                invokeCommand.SetValue(CommandProperty, e.NewValue);

        }

        protected override void Invoke(object parameter)

        {

            if (this.Command == null)

                return;

            if (this.Command.CanExecute(parameter))

            {

                var commandParameter = new ExtendedCommandParameter(parameter as EventArgsthis.AssociatedObject,

                                                                    GetValue(CommandParameterProperty));

                this.Command.Execute(commandParameter);

            }

        }

        #region public properties

        public object CommandParameter

        {

            get { return GetValue(CommandParameterProperty); }

            set { SetValue(CommandParameterProperty, value); }

        }

        public ICommand Command

        {

            get { return GetValue(CommandProperty) as ICommand; }

            set { SetValue(CommandParameterProperty, value); }

        }

        #endregion

    }

}

二、View

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

 xmlns:local="ExtendedInvokeCommandAction类所在命名空间"

  <TextBox x:Name="txtControlID"  >

                        <i:Interaction.Triggers>

                            <i:EventTrigger EventName="PreviewKeyDown">

                                <local:ExtendedInvokeCommandAction

                                        Command="{Binding CustomCommand}"

                                        //这里不绑定则ExtendedCommandParameter.Parameter的值为对应ViewModel的值,否则可绑定其他控件的属性值

                                        CommandParameter="{Binding}"

                                />

                            </i:EventTrigger>

                        </i:Interaction.Triggers>

                    </TextBox>

三、ViewMode
 public ICommand CustomCommand

        {

            get

            {

                return new DelegateCommand<object>(x =>

                    {

                        ExtendedCommandParameter p = x as ExtendedCommandParameter;

                         p.sender  触发事件对象

                         p.EventArgs 事件参数                                       

                    });

            }

        }

posted @ 2011-07-05 14:25    阅读(3294)  评论(0编辑  收藏  举报