WPF MVVM防止选项卡更改

本文关键字:选项 MVVM WPF | 更新日期: 2023-09-27 18:16:07

我有一个WPF选项卡控件,有两个选项卡叫做"OFFLINE" &"在线"。当点击"ONLINE"选项卡时,我需要检查申请是否处于在线状态。如果(状态!)=在线)显示错误信息,防止显示"ONLINE"(第二次)选项卡,并转到"OFFLINE"选项卡。

视图。XAML

 <TabControl Name="dashboardTabControl" SelectedIndex="{Binding SelectedTabIndex,Mode=TwoWay}">
        <TabItem Header="Local Dashboard">
            <views:OfflineDashboard DataContext="{Binding OfflineDashboardViewModel}"/>
        </TabItem>
        <TabItem Header="Online Dashboard">
            <views:OnlineDashboard DataContext="{Binding OnlineDashboardViewModel}"/>
        </TabItem>
    </TabControl>

VIEWMODEL

       public int SelectedTabIndex
        {
            get
            {
                return this.selectedTabIndex;
            }
            set
            {
                if (value == 1 && !applicationData.IsApplicationOnline())
                {
                    this.SelectedTabIndex = 0;
                }
                else
                {
                    this.selectedTabIndex = value;
                }
                // TODO : According to the selected tab index , populate ONLINE/OFFLINE 
viewmodels
NotifyPropertyChange("SelectedTabIndex");
            }
        }

问题:虽然我检查了状态并将tab设置为0,但它不起作用。总是点击第二个选项卡,它将显示在线选项卡

WPF MVVM防止选项卡更改

我想用另一种方法。

让ViewModel监听网络变化并公开bool属性Online

将Tabpages的Enabled属性绑定到此bool值

这样你就不会用UI代码污染ViewModel

我终于找到了解决问题的办法:

XAML

<TabControl Name="dashboardTabControl"  Margin="0,5,0,0" Grid.Row="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <TabItem Header="Local Dashboard" IsSelected="{Binding IsOnline,Converter={StaticResource invertBoolConverter}}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Top">
                    <views:OfflineDashboard DataContext="{Binding OfflineDashboardViewModel}"/>
                </TabItem>
                <TabItem Header="Online Dashboard" IsSelected="{Binding IsOnline}" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Top">
                    <views:OnlineDashboard DataContext="{Binding OnlineDashboardViewModel}"/>
                </TabItem>

现在我使用IsSelected属性的TabItem,而不是SelectedIndex

VIEWMODEL

public bool IsOnline
        {
            get
            {
                return isOnline;
            }
            set
            {
                // When ONLINE tab click, check whether application is online,
                // if not, do not display ONLINE tab
                if (value && !applicationData.IsApplicationOnline())
                {
                    isOnline = false;
                    return;
                }
                else
                {
                    isOnline = value;
                }
                LoadTabContent();
                NotifyPropertyChange("IsOnline");
            }
        }

我的问题解决了

你应该在你的ViewModel实现INotifyPropertyChanged。在更改SelectedTabIndex通知视图后,通过INotifyPropertyChanged的PropertyChanged事件更改了选项卡控件的选定索引。

在XAML中做

SelectedIndex="{Binding SelectedTabIndex,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}