我有一个WPF Tab控件,有两个标签,名为“OFFLINE”& “线上”。单击“在线”选项卡时,我需要判断应用程序是否处于联机状态。如果(状态!=在线) 显示错误消息并阻止显示“在线”(第二个)选项卡并转到“离线”选项卡。
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,但它不起作用。 总是点击第二个标签,它将显示在线标签。
答案 0 :(得分:2)
我会以相反的方式做到这一点。
让ViewModel侦听网络更改并在线公开bool属性。
将Tabpages的Enabled属性绑定到此bool。
这样您就不会使用UI代码污染ViewModel。
答案 1 :(得分: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>
现在我使用的是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");
}
}
这解决了我的问题。
答案 2 :(得分:0)
您应该在ViewModel
中实施INotifyPropertyChanged。更改SelectedTabIndex
通知后,通过INotifyPropertyChanged
SelectedIndex="{Binding SelectedTabIndex,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
事件更改了选定的标签控件索引。
在你的XAML中
{{1}}