Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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# 如何调试/排除未触发的事件?_C#_Wpf_Mvvm_Data Binding_Mvvm Light - Fatal编程技术网

C# 如何调试/排除未触发的事件?

C# 如何调试/排除未触发的事件?,c#,wpf,mvvm,data-binding,mvvm-light,C#,Wpf,Mvvm,Data Binding,Mvvm Light,在我的一个视图中,TabControl上有两个事件触发器: <i:Interaction.Triggers> <i:EventTrigger EventName="SelectedItemChanged"> <cmd:EventToCommand Command="{Binding TestCommand}"/> </i:EventTrigger> <i:EventTrigger EventName="

在我的一个视图中,TabControl上有两个事件触发器:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectedItemChanged">
        <cmd:EventToCommand Command="{Binding TestCommand}"/>
    </i:EventTrigger>
    <i:EventTrigger EventName="TabClosed">
        <cmd:EventToCommand Command="{Binding CloseCurrentWorkspaceCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

以下是命令绑定的代码:

RelayCommand _t;
public RelayCommand TestCommand { get { return _t ?? (_t = new RelayCommand(foo)); } }
void foo()
{
    // This is just to see if the event is firing.
    System.Windows.MessageBox.Show("Fired");
}

RelayCommand _closeWorkspaceCommand;
public RelayCommand CloseCurrentWorkspaceCommand
{
    get { return _closeWorkspaceCommand ?? (_closeWorkspaceCommand = new RelayCommand(CloseWorkspace)); }
}

void CloseWorkspace()
{
    // Workspaces is a ObservableCollection<WorkspaceViewModel>
    Workspaces.Remove(SelectedItem);
}
RelayCommand\u t;
public RelayCommand TestCommand{get{return\u t???(\u t=new RelayCommand(foo));}
void foo()
{
//这只是为了看看事件是否触发。
System.Windows.MessageBox.Show(“已启动”);
}
RelayCommand\u closeworkspace命令;
public relay命令closeCurrentWorkspace命令
{
获取{return\u closeworkspacecondrom??(\u closeworkspacecondrom=newrelaycommand(CloseWorkspace));}
}
void CloseWorkspace()
{
//工作空间是一个可观察的集合
工作区。删除(选择编辑项);
}
当所选项目(或索引)更改时,SelectedItemChanged事件从不激发。将事件更改为SelectedIndexChanged也没有效果。TabClosed事件在没有问题的情况下激发。SelectedIndex和SelectedItem绑定将相应更新

我检查了输出窗口,没有看到任何绑定错误或任何可能表明绑定错误的内容

如何开始诊断此事件为何不会触发

完整控制代码:

<wpf:TabControlExt Grid.Row="1" 
    ItemsSource="{Binding Workspaces}" 
    SelectedItem="{Binding SelectedItem}"
    SelectedIndex="{Binding SelectedIndex}">
    <wpf:TabControlExt.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header, Mode=TwoWay}"/>
        </DataTemplate>
    </wpf:TabControlExt.ItemTemplate>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectedItemChanged">
            <cmd:EventToCommand Command="{Binding TestCommand}"/>
        </i:EventTrigger>
        <i:EventTrigger EventName="TabClosed">
            <cmd:EventToCommand Command="{Binding CloseCurrentWorkspaceCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</wpf:TabControlExt>

修复了它

结果证明我参加了错误的活动。我应该已经绑定到
SelectionChanged
。我只是在Blend中查看触发器窗格时才发现这一点。它没有给我选择
SelectedIndexChanged
SelectedItemChanged
的选项

尽管事后看来,SelectionChanged更有意义,因为当项目更改时,索引也会更改,而且据我所知,您无法重新排列控件中的选项卡

因此正确的代码是:

<i:EventTrigger EventName="SelectionChanged">
    <cmd:EventToCommand Command="{Binding TestCommand}"/>
</i:EventTrigger>

Syncfusion。既然您选择了dex=“{Binding SelectedIndex}”,为什么要触发SelectedItemChanged?如果SelectedIndex绑定良好,那么一切都将正常。我已尝试SelectedIndexChanged事件,但它仍然不会触发。