无法在自定义 TextBox 的 EventTrigger 上从 CallMethodAction 调用方法

Can't call method from CallMethodAction on EventTrigger of custom TextBox

出现错误:“在 'MyType' 类型的对象上找不到与预期签名匹配的名为 'LostFocus' 的方法。”

<DataGridTemplateColumn MinWidth="80" Width="1.25*" Header="6">
     <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <customControlls:NumericTextBox x:Name="cc" 
                     Style="{StaticResource NumericTextboxStyle}" 
                     Text="{Binding AccountsReceivable.OverdueAtTheEndOfTheReportingPeriod, UpdateSourceTrigger=LostFocus}">
                 <interactivity:Interaction.Triggers>
                     <interactivity:EventTrigger EventName="LostFocus" SourceName="cc">
                        <interactions:CallMethodAction TargetObject="{Binding}" MethodName="LostFocus"/>
                     </interactivity:EventTrigger>
                 </interactivity:Interaction.Triggers>
             </customControlls:NumericTextBox>
         </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

以及我尝试调用的 ViewModel 中的方法。我也尝试从方法中删除参数,仍然是同样的错误。

public void LostFocus(object sender, EventArgs e){}

我成功了。您需要将 TargetObject 绑定到 DataGrid 的 DataContext。

<DataGridTemplateColumn MinWidth="80" Width="1.25*" Header="6">
 <DataGridTemplateColumn.CellTemplate>
     <DataTemplate>
         <customControlls:NumericTextBox 
                 Style="{StaticResource NumericTextboxStyle}" 
                 Text="{Binding AccountsReceivable.OverdueAtTheEndOfTheReportingPeriod, UpdateSourceTrigger=LostFocus}">
             <interactivity:Interaction.Triggers>
                 <interactivity:EventTrigger EventName="LostFocus">
                    <interactions:CallMethodAction MethodName="LostFocus" TargetObject="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext}" />
                 </interactivity:EventTrigger>
             </interactivity:Interaction.Triggers>
         </customControlls:NumericTextBox>
     </DataTemplate>
 </DataGridTemplateColumn.CellTemplate>

将调用的方法签名应该是:

public void LostFocus(object sender, RoutedEventArgs e){}

我也遇到了这个问题,而是编写了自己的 TriggerAction 来摆脱具有特定方法签名的约束。请注意,必须改进此代码才能完全可行(方法参数)

public class InvokeMethodAction : Microsoft.Xaml.Behaviors.TriggerAction<DependencyObject>
{
    public static readonly DependencyProperty TargetObjectProperty = DependencyProperty.Register(
        nameof(TargetObject), typeof(FrameworkElement), typeof(InvokeMethodAction), new PropertyMetadata(default(FrameworkElement)));

    public FrameworkElement TargetObject
    {
        get { return (FrameworkElement) GetValue(TargetObjectProperty); }
        set { SetValue(TargetObjectProperty, value); }
    }

    public static readonly DependencyProperty MethodNameProperty = DependencyProperty.Register(
        nameof(MethodName), typeof(string), typeof(InvokeMethodAction), new PropertyMetadata(default(string)));

    public string MethodName
    {
        get { return (string) GetValue(MethodNameProperty); }
        set { SetValue(MethodNameProperty, value); }
    }

    /// <inheritdoc />
    protected override void Invoke(object parameter)
    {
        if (TargetObject != null && MethodName != null)
        {
            var method = TargetObject.GetType().GetMethod(MethodName);
            if (method != null)
            {
                method.Invoke(TargetObject, null);
            }
        }
    }
}