TabControl ItemsSource更新后如何选择第一个TabItem?

问题描述 投票:0回答:1

我的应用程序正在使用TabItems显示不同的UserControl,例如登录名/产品/设置页面。当您打开应用程序时,只有一个选项卡可用并被选中,即登录页面,成功登录后,该页面将被删除,而其他页面将被加载并选择第一个选项卡。当我注销时,所有页面都将被删除,而登录页面又被加载,但是未被选中。我正在使用MVVM模式,因此不想在ViewModel中编写在UI中的操作。

如果是列表中唯一的项目,是否可以选择ItemTab?例如,要在后面的代码中编写一个方法并将其连接到TabControl SelectedIndex?

我试图在后面的代码中为SourceUpdated和TargetUpdated创建事件处理程序,但未成功。

MainWindow.xaml

<TabControl x:Name="ApplicationTabs"
    ItemsSource="{Binding Tabs}"                   
    SelectedIndex="0">

<TabControl.Resources>
    <Style TargetType="{x:Type TabPanel}">
        <Setter Property="HorizontalAlignment" Value="Center" />
    </Style>

    <DataTemplate DataType="{x:Type VMod:LoginViewModel}">
        <Pages:LoginView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type VMod:AdminViewModel}">
        <Pages:AdminView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type VMod:ProductsViewModel}">
        <Pages:ProductsView />
    </DataTemplate>                    
</TabControl.Resources>

<TabControl.ItemTemplate>
    <DataTemplate DataType="{x:Type inter:ITab}">
        <TextBlock>
            <Run Text="{Binding TabName}" />
        </TextBlock>
    </DataTemplate>
</TabControl.ItemTemplate> </TabControl>

MainWindowViewModel.cs(BaseViewModel具有INotifyPropertyChanged)

class MainWindowViewModel : BaseViewModel
{
    public static IList<ITab> Tabs { get; set; }        
    public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;

    public MainWindowViewModel()
    {
        Tabs = new ObservableCollection<ITab>();
        LoadLoginPage();
    }

    public static void RaiseStaticPropertyChanged (string PropertyName)
    {StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(PropertyName));}

    public static void LoadLoginPage()
    {
        if (Tabs != null) Tabs.Clear();

        Tabs.Add(new LoginViewModel());     

        RaiseStaticPropertyChanged("Tabs");
    } // LoadTabs() create and load login page to the tab collection

    public static void LoadTabs()
    {
        if (Tabs != null) Tabs.Clear();

        Tabs.Add(new AdminViewModel());
        Tabs.Add(new ProductsViewModel());          

        RaiseStaticPropertyChanged("Tabs");         
    } // LoadTabs() method loads specific tabs to the collection

    public static void LogIn(object x)
    {
        LoggedInUser = (User)x;
        LoadTabs();
    }

    public static void LogOut(object x)
    {
        LoggedInUser = null;
        LoadLoginPage();            
    }   
}
wpf mvvm tabcontrol tabitem selectedindex
1个回答
0
投票

经过多次试验和错误终于发现,我在后面代码中关于TargetUpdated事件处理程序的最初想法是正确的。我只是不知道我的ItemSource绑定需要NotifyOnTargetUpdated。因此,我没有违反MVVM规则。

正确的装订:

<TabControl x:Name="ApplicationTabs"
                ItemsSource="{Binding Tabs,                                                                                                        
                              NotifyOnTargetUpdated=True}"
                Grid.Row="1"                   
                TargetUpdated="TabsUpdated"> (...) </TabControl>

后面的代码:

private void TabsUpdated(object sender, DataTransferEventArgs e)
    {
        if(ApplicationTabs.Items.Count == 1)
        {
            ApplicationTabs.SelectedIndex = 0;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.