获取视图模型中的选定选项卡(wpf)

nan*_*nan 4 c# wpf tabs mvvm viewmodel

我有一个主视图,它有一个选项卡控件.选择选项卡后,它会调用相应的视图进行显示.我在视图模型中有一个函数,它必须知道选择了哪个选项卡来执行操作.我该如何实现这一目标?视图模型将如何知道选择了哪个选项卡?

Sin*_*tic 7

很简单:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication2"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:TestViewModel x:Key="MainViewModel"/>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TabControl DataContext="{StaticResource MainViewModel}" 
                    SelectedIndex="{Binding Selected}" 
                    Grid.Row="0" 
                    x:Name="TestTabs">
            <TabItem Header="Section 1"/>
            <TabItem Header="Section 2"/>
            <TabItem Header="Section 3"/>
        </TabControl>
        <Button Content="Check 
                Selected Index" 
                Grid.Row="1" 
                x:Name="TestButton" 
                Click="TestButton_OnClick"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

这里以声明方式将模型定义为数据上下文.selectedindex属性绑定到模型,因此只要它发生变化,它在视图模型上映射的属性也会发生变化

class TestViewModel : INotifyPropertyChanged
{
    private int _selected;
    public int Selected
    {
        get { return _selected; }
        set
        {
            _selected = value;
            OnPropertyChanged("Selected");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这实现了INotifyPropertyChanged,因此视图将向其注册.在这里的处理程序中,我输出Selected的值以在您更改它们时显示.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void TestButton_OnClick(object sender, RoutedEventArgs e)
    {
        var vm = TestTabs.DataContext as TestViewModel;
        MessageBox.Show(string.Format("You selected tab {0}", vm.Selected));
    }
}
Run Code Online (Sandbox Code Playgroud)

这将获取viewmodel,然后向我们显示属性实际上已更新.