私はXamarin Formsアプリケーションでオブジェクトを処分する正しい方法を探しています。現在、私はXAMLとMVVMコーディングスタイルを使用しています。私のビューモデルから、私は組み込みサービスロケータ(DependencyService)を介して使い捨てオブジェクトへの参照を取得します。理想的には、ビューモデルからオブジェクトにDispose()を呼び出すことができるはずですが、ContentPage.OnDisappearingとNavigationPage.Poppedに接続するなどの他のソリューションも実現可能です。Xamarin.Formsでオブジェクトを廃棄する
答えて
私は数週間前にほとんど同じ要件を持っていました。私は、ページが閉じられたときに、自分のビューモデルのイベントサブスクリプションの購読を解除するようにしたいと思っていました。多くの研究の後、私の結論は、最も簡単な解決策はContentPage.OnDisappearingメソッドを使用することでした。
あなたが処理したいオブジェクトがViewModelにあることを指摘したので、それが消えているときにViewModelに通知するためのインフラストラクチャが少し必要です。これを行うために、2つの主要なメソッドOnAppearingとOnDisappearingを持つビューモデルの基本実装を定義しました(ここではIPropertyNotify実装などの他の基本機能があるため、インターフェイスではなくクラスです)。
public class ViewModelBase
{
/// <summary>
/// Called when page is appearing.
/// </summary>
public virtual void OnAppearing()
{
// No default implementation.
}
/// <summary>
/// Called when the view model is disappearing. View Model clean-up should be performed here.
/// </summary>
public virtual void OnDisappearing()
{
// No default implementation.
}
}
は、その後、私はContentPageをsubsclassedとOnAppearingとOnDisappearingメソッドをオーバーライドして、私の見解モデルを通知するためにそれらを使用しています。
<?xml version="1.0" encoding="utf-8" ?>
<pages:PageBase xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:Forms.App.Controls;assembly=Forms.App"
xmlns:converters="clr-namespace:Forms.App.Converters;assembly=Forms.App"
xmlns:pages="clr-namespace:Forms.App.Pages;assembly=Forms.App"
x:Class="Forms.App.Pages.LogonPage"
NavigationPage.HasNavigationBar="False"
Title="Logon">
そして、あなたのViewModelにあなたは、あなたのOnDisappearingメソッドをオーバーライドして、オブジェクトを配置することができます:あなたがページを実装する際
public class PageBase : ContentPage
{
/// <summary>
/// Performs page clean-up.
/// </summary>
protected override void OnDisappearing()
{
base.OnDisappearing();
var viewModel = BindingContext as ViewModelBase;
// Inform the view model that it is disappearing so that it can remove event handlers
// and perform any other clean-up required..
viewModel?.OnDisappearing();
}
protected override void OnAppearing()
{
// Inform the view model that it is appearing
var viewModel = BindingContext as ViewModelBase;
// Inform the view model that it is appearing.
viewModel?.OnAppearing();
}
}
それからちょうどそれが型PageBaseであることを確認してください
public class FormViewModel : ViewModelBase
{
public override void OnDisappearing()
{
base.OnDisappearing();
// Dispose whatever objects are neede here
}
}
スタックナビゲーションを使用している場合、現在のページの上に別のページをスタックすると、OnDisappearingメソッドが呼び出されます(ページが消えているテンポやがて結局のところ)。だからあなたはこれに対応し、おそらくあなたのオブジェクトを処分しないでください。しかし、あなたのページの上に何かを積み重ねていなければ、心配することはありません。私のケースでは、イベントのサブスクリプションだけだったので、OnAppearingにイベントハンドラを添付し、OnDisappearingでイベントハンドラを切り離しました。
私はあなたを助けることを願っています!
ListViewsまたはLabelsへのバインディングがページ/フラグメントが破棄されているときに値が変更されたときに、Formsにオブジェクト例外が処理されていました。あなたがViewModel内のオブジェクトを、私たちがバインディングを削除していたのと同じ場所に配置できると仮定しています。
protected override void OnParentSet()
{
base.OnParentSet();
if (Parent == null)
{
//Clear a bunch of bindings or dispose of ViewModel objects
BindingContext =
_listView.ItemsSource = null;
}
}
- 1. StringBuilderオブジェクトを廃棄する
- 2. NUnit-オブジェクトの廃棄
- 3. プール内のオブジェクトを廃棄する
- 4. Structuremap DataContextオブジェクトの廃棄
- 5. NullPointerException:Timertaskキャンセルとオブジェクトの廃棄
- 6. Xamarin.Formsでページをポップした後でViewModelを廃棄する方法は?
- 7. WCF - 廃棄オブジェクトにアクセスできない
- 8. 「廃棄オブジェクトにアクセスできない」
- 9. WCFの統合とオブジェクトの廃棄
- 10. StructureMapコンテナを廃棄する
- 11. ブラシを廃棄する
- 12. ImageListを廃棄する
- 13. 廃棄インスタンス
- 14. IServiceProviderガベージコレクション/廃棄
- 15. カスタムオブジェクトの廃棄
- 16. ネットワーク廃棄ステータス
- 17. パケットをC++でIPで廃棄する
- 18. Xamarin iOS廃棄オブジェクトにアクセスできないオブジェクト名: ''
- 19. LibGdxで画面を廃棄する
- 20. C#でリソースを廃棄する
- 21. libpcapでパケットを廃棄する
- 22. オブジェクトを作成の逆の順序で廃棄しますか?
- 23. オブジェクトを正しく廃棄する方法(ASP.NET MVC + Entity Framework)
- 24. xlsread [num]廃棄NaN
- 25. Xamarinフォーム廃棄Textview
- 26. xamarinフォームプロジェクトで廃棄オブジェクト例外にアクセスできません
- 27. スクラップ、JavaScript内のデータを廃棄する
- 28. ViewModelsとCanExecuteハンドラを廃棄する
- 29. DrawImageを非表示/廃棄する
- 30. パターン使用を廃棄する
あなたは何を質問しているのですか。あなたがすでに提案した提案に何が間違っていますか? – Neil
私はビューモデルからの処分をどのように処理すべきか分かりません。他の2つのオプションは、コードが異なるファイルにまたがって広がっており、追加のコーディングが必要なため、きれいではありません。 – Kalitsov