Я создал InvokeCommandActionмероприятие программно, как эта ссылка.
Но я не знаю, как программно создать следующее событие,
<i:Interaction.Triggers>
<i:EventTrigger EventName = "Drop">
<cmd:EventCommandExecuter Command = "{Binding AddGridCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Я пробовал, как показано ниже, но в команде EventCommandExecuter возвращается значение null. Пожалуйста, предложите мне добиться этого.
void SetGridTrigger(Grid itemsControl, string bindingPath)
{
var binding = new Binding { Path = new PropertyPath(bindingPath) };
ICommand DropCommand = (binding as ICommand);
var eventCommandExecuter = new EventCommandExecuter { Command = DropCommand };
BindingOperations.SetBinding(eventCommandExecuter, InvokeCommandAction.CommandProperty, binding);
var eventTrigger = new System.Windows.Interactivity.EventTrigger { EventName = "Drop" };
eventTrigger.Actions.Add(eventCommandExecuter);
var triggers = Interaction.GetTriggers(itemsControl);
triggers.Add(eventTrigger);
}
EventCommandExecuter
public class EventCommandExecuter : TriggerAction<DependencyObject>
{
#region Constructors
public EventCommandExecuter()
: this(CultureInfo.CurrentCulture)
{
}
public EventCommandExecuter(CultureInfo culture)
{
Culture = culture;
}
#endregion
#region Properties
#region Command
public ICommand Command
{
get { return (ICommand)GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof(ICommand), typeof(EventCommandExecuter), new PropertyMetadata(null));
#endregion
#region EventArgsConverterParameter
public object EventArgsConverterParameter
{
get { return (object)GetValue(EventArgsConverterParameterProperty); }
set { SetValue(EventArgsConverterParameterProperty, value); }
}
public static readonly DependencyProperty EventArgsConverterParameterProperty =
DependencyProperty.Register("EventArgsConverterParameter", typeof(object), typeof(EventCommandExecuter), new PropertyMetadata(null));
#endregion
public IValueConverter EventArgsConverter { get; set; }
public CultureInfo Culture { get; set; }
#endregion
protected override void Invoke(object parameter)
{
var cmd = Command;
if (cmd != null)
{
var param = parameter;
if (EventArgsConverter != null)
{
param = EventArgsConverter.Convert(parameter, typeof(object), EventArgsConverterParameter, CultureInfo.InvariantCulture);
}
if (cmd.CanExecute(param))
{
cmd.Execute(param);
}
}
}
}
Что такое EventCommandExecuter? Почему вы не используете класс InvokeCommandAction как есть?
@ mm8, мне нужно перенаправленное событие в viewmodel. Поэтому я использовал EventCommandExecuter. Пожалуйста, обратитесь к моему обновленному коду.





Вы должны привязать EventCommandExecuter.CommandProperty к своему пути привязки:
EventCommandExecuter eventCommandExecuter = new EventCommandExecuter();
BindingOperations.SetBinding(eventCommandExecuter, EventCommandExecuter.CommandProperty,
new Binding { Path = new PropertyPath(bindingPath) });
EventTrigger eventTrigger = new EventTrigger { EventName = "Drop" };
eventTrigger.Actions.Add(eventCommandExecuter);
Interaction.GetTriggers(itemsControl).Add(eventTrigger);
Очень красивый глаз, я этого не заметил, в своем ответе я сосредоточился на неправильной привязке, не заметил этой ошибки.
Я не очень хорошо понимаю причину этой настройки: ICommand DropCommand = (привязка как ICommand);