带参数的Wpf tabcontrol trig

Wpf tabcontrol trig with parameter

我在 wpf 中有一个选项卡控件,我想在选项卡选择更改时向我的视图模型发送一个触发器。 trig 应包括选项卡名称或选项卡索引。

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <i:InvokeCommandAction Command="{Binding Path=TabChangedCommand}"
                               CommandParameter="{Binding ElementName=TabControl, Path=Name}"/>
        </i:EventTrigger>
</i:Interaction.Triggers>

触发器工作正常,但参数始终为空。

您没有在 CommandParameter 中传递 ElementName。

    <TabControl x:Name="mytab">
     ....
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding Path=TabChangedCommand}"
                                   CommandParameter="{Binding ElementName=mytab}"/>
            </i:EventTrigger>
    </i:Interaction.Triggers>
    ....
    </TabControl>

做这样的事情

您可以通过使用 MVVM 实现您正在尝试的目标。

您的 ViewModel 中会有两个属性,一个 属性 用于保存所有可用选项卡的集合,另一个 属性 用于保存当前选定的选项卡。

ViewModel

public ObservableCollection<ITabViewModel> Tabs { get; private set; }

public ITabViewModel SelectedTab
{
    get { return _selectedTab; }
    set
    {
        _selectedTab = value;
        RaisePropertyChanged(() => SelectedTab);
    }
}

XAML

<TabControl ItemsSource="{Binding Tabs}"
            SelectedItem="{Binding SelectedTab}" />

通过上述设置,ViewModel 中的 SelectedTab 属性 会在视图中发生选项卡切换时更新。

或者,如果您只对所选选项卡的索引感兴趣。在 ViewModel 中有一个 属性 来保存选定的选项卡索引并将其绑定到 TabControl 上的 SelectedIndex 属性。

ViewModel

public int SelectedTabIndex
{
    get { return _selectedTabIndex; }
    set
    {
        _selectedTabIndex = value;
        RaisePropertyChanged(() => SelectedTabIndex);
    }
}

XAML

<TabControl ItemsSource="{Binding Tabs}"
            SelectedIndex="{Binding SelectedTabIndex}"  />