2013-05-31 26 views
3

我正在使用名为“OFFLINE”的两个选项卡的WPF选项卡控件&“ONLINE”。当“在线”标签点击时,我需要知道应用程序是否处于在线状态。如果(状态!=在线) 显示错误消息并且阻止显示“在线”(第2)标签并且转到“离线”标签。WPF MVVM阻止选项卡更改

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"); 
      } 
     } 

问题:虽然我检查状态和设置选项卡为0,这是行不通的。 总是点击第二个选项卡,它将显示在线选项卡上。

回答

1

最后我发现我的问题的解决方案:

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"); 
      } 
     } 

这解决了我的问题。

0

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

而在你的XAML做

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

已经完成,更新了代码,但没有运气。 –

+0

@MadurikaWelivita甚至没有编辑XAML之后? –

+1

是的,我已经尝试过了,但它会转到在线标签 –

2

我这个做周围的其他方式。

让ViewModel监听网络更改并在线显示bool属性。

将Tabpages的Enabled属性绑定到该布尔值。

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

+0

是的,我也向我的团队提出了这个建议。因为我们使用Mediator,所以我们可以使用它来解决这个问题。但禁用选项卡不是业务需求。 –

+0

您还可以将任何其他视觉方面绑定到Online属性。 –

相关问题