如何调试/解决未触发的事件?

时间:2016-02-24 10:34:56

标签: c# wpf mvvm data-binding mvvm-light

在我的一个观点中,我在TabControl上有2个事件触发器:

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

当更改所选项目(或索引)时,SelectedItemChanged事件永远不会触发。将事件更改为SelectedIndexChanged也无效。 TabClos​​ed事件触发没有问题。 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>

1 个答案:

答案 0 :(得分:0)

修正了它。

事实证明我绑定了错误的事件。我应该对SelectionChanged具有约束力。我只是在浏览Blend中的Triggers窗格时才发现这一点。它没有给我选择SelectedIndexChangedSelectedItemChanged的选项。

虽然事后看来,SelectionChanged更有意义,因为当项目发生变化时,索引会发生变化,而且据我所知,你无法重新排列控件中的标签。

所以正确的代码是:

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