Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据条件调用第二个I:EventTrigger_C#_Wpf_Xaml_Interaction_Eventtrigger - Fatal编程技术网

C# 根据条件调用第二个I:EventTrigger

C# 根据条件调用第二个I:EventTrigger,c#,wpf,xaml,interaction,eventtrigger,C#,Wpf,Xaml,Interaction,Eventtrigger,我有一个带有两个I:EventTrigger的CustomButton。第一个交互正在调用一个方法(SubmitResult),第二个交互(ClosePopupAction)应该只对第一个交互的结果进行调用。我使用IsEnabled属性的实现不起作用 XAML 行动 公共类ClosePopupAction:TargetedTriggerAction { 受保护的覆盖无效调用(对象参数) { HtChildWindow window=FindChildWindow(关联对象); 窗口?.Close

我有一个带有两个
I:EventTrigger
CustomButton
。第一个交互正在调用一个方法(SubmitResult),第二个交互(ClosePopupAction)应该只对第一个交互的结果进行调用。我使用
IsEnabled
属性的实现不起作用

XAML 行动
公共类ClosePopupAction:TargetedTriggerAction
{
受保护的覆盖无效调用(对象参数)
{
HtChildWindow window=FindChildWindow(关联对象);
窗口?.Close();
}
私有HtChildWindow FindChildWindow(DependencyObject元素)
{
IAttachedObject attachedObject=作为IAttachedObject的元素;
if(attachedObject!=null)
返回FindChildWindow(attachedObject.AssociatedObject);
HtChildWindow childWindow=元素作为HtChildWindow;
返回childWindow??FindChildWindow(VisualTreeHelper.GetParent(元素));
}
}

如果我将
InvokeClose
设置为
true
作为initalValue,它将按预期工作。

是否希望第二个正常工作?您不需要将目标弹出窗口也传递给它吗?如果ClosePopupAction是一个自定义操作,我们可以看到您的代码吗?已添加该操作。我正在SubmitData()方法中将一些数据写入数据库。如果一切顺利,我想关闭这个弹出窗口。我已经有了解决办法。(我为事件制作了一个
EventHandler
并通过
I:EventTrigger EventName=“InvokeClose”SourceObject=“{Binding RelativeSource={RelativeSource TemplatedParent}}”>
进行侦听。但我还需要另一个解决方案。只有在“InvokeClose”bool为true时,才应调用ClosePopupAction。)但是,如果第一个操作是应该将InvokeClose设置为True的操作,那么您必须再次单击,第二个操作(现在将启用)才能工作。没有?是的,但是第一个动作又被触发了,我只需要点击一下就可以了。什么,怎么做?这难道不是多余的吗?我觉得有些不对劲。我本以为第一个操作(单独)会从ViewModel调用命令。在那里,它将转到管理您的窗口的服务,并关闭您需要的窗口…您希望第二个窗口正常工作吗?您不需要将目标弹出窗口也传递给它吗?如果ClosePopupAction是一个自定义操作,我们可以看到您的代码吗?已添加该操作。我正在SubmitData()方法中将一些数据写入数据库。如果一切顺利,我想关闭这个弹出窗口。我已经有了解决办法。(我为事件制作了一个
EventHandler
并通过
I:EventTrigger EventName=“InvokeClose”SourceObject=“{Binding RelativeSource={RelativeSource TemplatedParent}}”>
进行侦听。但我还需要另一个解决方案。只有在“InvokeClose”bool为true时,才应调用ClosePopupAction。)但是,如果第一个操作是应该将InvokeClose设置为True的操作,那么您必须再次单击,第二个操作(现在将启用)才能工作。没有?是的,但是第一个动作又被触发了,我只需要点击一下就可以了。什么,怎么做?这难道不是多余的吗?我觉得有些不对劲。我本以为第一个操作(单独)会从ViewModel调用命令。在那里,它将转到管理您的窗口的服务,并关闭您需要的窗口。。。
<Controls:CustomButton>
    <I:Interaction.Triggers>
        <I:EventTrigger EventName="CustomClick">
            <Ei:CallMethodAction TargetObject="{Binding RelativeSource={RelativeSource TemplatedParent}}" MethodName="SubmitData"/>
        </I:EventTrigger>
        <I:EventTrigger EventName="CustomClick">
            <Actions:ClosePopupAction IsEnabled="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=InvokeClose, UpdateSourceTrigger=PropertyChanged}"/>
        </I:EventTrigger>
    </I:Interaction.Triggers>
</Controls:CustomButton>
public bool InvokeClose
{
    get { return _InvokeClose; }
    set
    {
        if (_InvokeClose == value) return;
        _InvokeClose = value;
        OnPropertyChanged();
    }
}
private bool _InvokeClose;

public void SubmitData()
{
    InvokeClose = true;
}
public class ClosePopupAction:TargetedTriggerAction<DependencyObject>
{
    protected override void Invoke(object parameter)
    {
        HtChildWindow window = FindChildWindow(AssociatedObject);
        window?.Close();
    }

    private HtChildWindow FindChildWindow(DependencyObject element)
    {
        IAttachedObject attachedObject = element as IAttachedObject;
        if(attachedObject != null)
            return FindChildWindow(attachedObject.AssociatedObject);

        HtChildWindow childWindow = element as HtChildWindow;
        return childWindow ?? FindChildWindow(VisualTreeHelper.GetParent(element));
    }
}