2011-01-21 35 views
2

我有一個TabControl,它顯示我的ViewModels的集合。 ViewModel和View之間的映射由DataTemplate實現。我使用MVVM,但沒有PRISM(出於歷史原因)。 ViewModel的基類有一個加載信息的方法Load。我想要做的只是在選擇與當前ViewModel對應的TabItem(延遲加載)時調用此方法。有任何想法嗎? PS我找到了類似問題的答案 - Lazy loading WPF tab content但我無法理解如何在MVVM中使用方法2。TabControls(MVVM)中的延遲加載

回答

12

TabItem作爲任何選擇器項目具有IsSelected屬性。您可以嘗試使用雙向綁定將其與視圖模型綁定。當模型的IsSelected第一次設置爲true時,您可能會加載您的數據。

XAML:

<TabControl ...> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="{x:Type TabItem}"> 
      <Setter Property="IsSelected" 
        Value="{Binding Path=IsSelected,Mode=TwoWay}"/> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 

樣品型號:

public class MyViewModel : INotifyPropertyChanged 
{ 
    private bool _isLoaded; 

    private void Load() 
    { 
     // code 
    } 

    private bool _isSelected; 

    public bool IsSelected 
    { 
     get 
     { 
      return this._isSelected; 
     } 
     set 
     { 
      if (this._isSelected != value) 
      { 
       this._isSelected = value; 

       if (this._isSelected && !this._isLoaded) 
       { 
        this.Load(); 
        this._isLoaded = true; 
       } 

       var propertyChanged = this.PropertyChanged; 
       if (propertyChanged != null) 
       { 
        propertyChanged(this, new PropertyChangedEventArgs("IsSelected")); 
       } 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

1.我不明白如何使用IsSelected屬性 - 我只有TabControl的,並且顯示在用戶控件它。所以我沒有明確的TabItems,也不知道如何得到它們。 – 2011-01-21 08:52:43

5

的另一種方式。這基本上模擬了MVVM中的一個SelectedTabChanged事件。

它通過標籤的Name屬性綁定到一個SelectedTabName屬性在視圖模型到你可以做你想要的(包括通過設定值返回到其以前的值防止標籤的變化)什麼的。

視圖模型

public string _selectedTabName; 
    public string SelectedTabName 
    { 
     get { return _selectedTabName; } 
     set 
     { 
      if (_selectedTabName != value) 
      { 
       _selectedTabName = value; 
       RaisePropertyChanged("SelectedTabName"); 

       if (SelectedTabName == "EVENTS" && EventsLoaded == false) 
       { 
        LoadEvents(); 
       } 

       if (SelectedTabName == "MESSAGES" && MessagesLoaded == false) 
       { 
        LoadMessages(); 
       } 
      } 
     } 
    } 

XAML

<TabControl SelectedValuePath="Name" SelectedValue="{Binding SelectedTabName}"> 
    <TabItem Header="Events" Name="EVENTS"> 
     ... 
    </TabItem> 
    <TabItem Header="Messages" Name="MESSAGES"> 
     ... 
    </TabItem> 
    </TabControl>