簡體   English   中英

WPF MVVM阻止選項卡更改

[英]WPF MVVM Prevent tab change

我有一個WPF Tab控件,有兩個名為“OFFLINE”和“ONLINE”的標簽。 單擊“在線”選項卡時,我需要判斷應用程序是否處於聯機狀態。如果(狀態!=在線)顯示錯誤消息並阻止顯示“在線”(第2個)選項卡並轉到“脫機”選項卡。

VIEW.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>

視圖模型

       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,但它不起作用。 總是點擊第二個選項卡,它將顯示在線選項卡。

我會以相反的方式做到這一點。

讓ViewModel偵聽網絡更改並在線公開bool屬性。

將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>

現在我使用TabItem的IsSelected屬性,而不是SelectedIndex

視圖模型

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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM