4

我有一个 WPF 选项卡控件,其中包含两个名为“离线”和“在线”的选项卡。单击“在线”选项卡时,我需要检查应用程序是否处于在线状态。如果(状态!=在线)显示错误消息并阻止显示“在线”(第二)选项卡并转到“离线”选项卡。

视图.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,但它不起作用。始终单击第二个选项卡,它将显示在线选项卡。

4

3 回答 3

2

我会反过来做。

让 ViewModel 监听网络变化并在线公开 bool 属性。

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

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

于 2013-05-31T08:34:28.533 回答
2

最后我找到了解决我的问题的方法:

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>

现在我使用IsSelectedTabItem 的属性,而不是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");
            }
        }

这解决了我的问题。

于 2013-06-03T14:00:20.247 回答
0

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

在你的 XAML 中做

SelectedIndex="{Binding SelectedTabIndex,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
于 2013-05-31T08:21:42.553 回答