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

时间:2016-12-28 19:11:23

标签: c# wpf xaml eventtrigger

获取错误:'无法找到名为' LostFocus'对于类型' MyType'的对象符合预期的签名。'

<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){}

2 个答案:

答案 0 :(得分:0)

我得到了它的工作。您需要将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){}

答案 1 :(得分:0)

我也遇到了这个问题,而是编写了自己的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);
            }
        }
    }
}