私は自分のViewModelsのコレクションを表示するTabControlを持っています。 ViewModelとViewの間のマッピングは、DataTemplateによって実装されます。私はMVVMを使用しますが、PRISMは使用しません(歴史的理由から)。 ViewModelのBaseクラスには、情報をロードするメソッドLoad
があります。私がしたいのは、現在のViewModelに対応するTabItemが選択されたとき(遅延読み込み時)にのみ、このメソッドを呼び出すことです。何か案は? PS同様の質問 - Lazy loading WPF tab contentの回答が見つかりましたが、MVVMでアプローチ2を使用する方法を理解できません。TabControls(MVVM)でレイジーローディング
2
A
答えて
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;
}
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>
関連する問題
- 1. JPAでレイジーローディング
- 2. ヴァーダインツリー。レイジーローディング
- 3. レイジーローディングIMG
- 4. レイジーローディングmvc3
- 5. Yiiレイジーローディング
- 6. node.jsのレイジーローディング
- 7. 休止レイジーローディングHQL
- 8. レイジーローディング補助ルート
- 9. Hibernateでのレイジーローディングとコレクション
- 10. レールでのロードとレイジーローディング
- 11. シームページのレイジーローディング部分?
- 12. レイジーローディングまたはオンデマンド
- 13. シングル.jsファイルとレイジーローディング
- 14. 城ActiveRecordレイジーローディングNOT Working
- 15. RecyclerViewのレイジーローディング効果
- 16. Entity FrameworkレイジーローディングとICollection
- 17. ASP.NET永続キャッシュ(「レイジーローディング」スタイル)
- 18. レイジーローディング、遅延ローディング、eagerローディングLINQ
- 19. Linqjsとノックアウトによるレイジーローディング
- 20. 画像のレイジーローディング(graceful degradation)(JavaScript)
- 21. 複雑なRavenDbオブジェクトのレイジーローディング
- 22. レイジーローディングとプロバイダーの戦略
- 23. XSJSサービスでレイジーローディングを実装する
- 24. EF4.3 POSTでのアタッチ後のコードファースト、MVC、レイジーローディング
- 25. (多層)組み込みTabControlsエラーのカスタム図面
- 26. BackColorが.NETのTabControlsで動作しないのはなぜですか?
- 27. MVVM Foundation対MVVMツールキット
- 28. MVVM/MVVM-Lightでレコードを編集する
- 29. Hibernate余分レイジーローディングおよびメモリ
- 30. EFレイジーローディングはnullを返します
1.私はIsSelectedプロパティを使用する方法を理解することはできません - 私はTabControlのと、それに表示されているユーザーコントロールを持っています。だから私は明示的なTabItemsを持っていないし、それらを取得する方法を知らない。 –
2.私はTabItemを持っていても、私はho IsSelectedプロパティが私を助けることができないことを理解できません。 IsSelectedIsTrueForThe1stTimeがLoadメソッドを呼び出すのはどこで確認できますか? –
答えに例を追加しました –