在我的一个观点中,我在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也无效。 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>
答案 0 :(得分:0)
修正了它。
事实证明我绑定了错误的事件。我应该对SelectionChanged
具有约束力。我只是在浏览Blend中的Triggers窗格时才发现这一点。它没有给我选择SelectedIndexChanged
或SelectedItemChanged
的选项。
虽然事后看来,SelectionChanged更有意义,因为当项目发生变化时,索引会发生变化,而且据我所知,你无法重新排列控件中的标签。
所以正确的代码是:
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding TestCommand}"/>
</i:EventTrigger>