2011-01-21 8 views
2

私は自分のViewModelsのコレクションを表示するTabControlを持っています。 ViewModelとViewの間のマッピングは、DataTemplateによって実装されます。私はMVVMを使用しますが、PRISMは使用しません(歴史的理由から)。 ViewModelのBaseクラスには、情報をロードするメソッドLoadがあります。私がしたいのは、現在のViewModelに対応するTabItemが選択されたとき(遅延読み込み時)にのみ、このメソッドを呼び出すことです。何か案は? PS同様の質問 - Lazy loading WPF tab contentの回答が見つかりましたが、MVVMでアプローチ2を使用する方法を理解できません。TabControls(MVVM)でレイジーローディング

答えて

12

任意のSelectorアイテムとしての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を持っていないし、それらを取得する方法を知らない。 –

+0

2.私はTabItemを持っていても、私はho IsSelectedプロパティが私を助けることができないことを理解できません。 IsSelectedIsTrueForThe1stTimeがLoadメソッドを呼び出すのはどこで確認できますか? –

+0

答えに例を追加しました –

5

もう一つの方法。これは基本的にMVVMのSelectedTabChangedイベントをシミュレートしています。

タブのNameプロパティをビューモデルのSelectedTabNameプロパティにバインドすることで機能します(値を以前の値に戻してタブの変更を防止するなど)。

のViewModel

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> 
関連する問題