[英]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.