2016-06-20 7 views
2

背景:基本的には、カスタムのAndroidレンダラを使用してXamarin.Formsにグリッドシステムを作成しています。これは、組み込みのグリッド実装では、実行しようとしているものが遅すぎます(100,000のセルを同時にスクロールすることはできません。我々が必要とする)。私は超過カップリングでこれを既に成功させました。私は上司が尋ねたようにリファクタリングしているので、私は問題に遭遇しました。プロパティが変更されたオブジェクトから変更されたことをコンテナオブジェクトに通知するにはどうすればよいですか?

シナリオ

//In Xamarin.Forms project 
class GridItems : BindableObject { 
    //Handles/contains all logic to how this grid will be laid out and its children 
} 

//In Xamarin.Forms project 
class Grid : View { 
    GridItems Source { get; set; } 
} 

//In Xamarin.Android project 
class GridRenderer { 
    OnElementPropertyChanged() { 
     //Here I can check what properties inside Grid changed 
    } 
} 

これは明らかに非常に単純化しているが、その理由は、それはあなたが単にサブクラスGridItemsはグリッドがでとるのアイテムの種類を変更することができるようにこの方法はセットアップで、どのようなセル/列の文字列値は等であり、GridクラスとGridRendererクラスを再利用する必要があります。

問題:GridItems自体内で変更された場合

、私はGrid.GridItemsに通知する必要があります。 GridItemsはプロパティの変更イベントを発生させることができますが、ローカルプロパティに対してのみ発生します。私は本質的にGridItemsがGridItemsが変更されたことをGridRendererが(Gridが変更されたので)変更し、それを無効にして、画面上で再描画するのをGridRendererが見ることができるように、

プロパティは、プロパティ自体から変更されたことを含むオブジェクトに通知するための良い方法はありますか?あるいは、私はこの問題にすべて迷っていますか?

+0

これはちょっと単純かもしれませんが、[データバインディングガイド](https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/)を見てきましたか? 'PropertyChanged'を上げることができるモデルを作成することができます – Paul

答えて

1

だから私はこれを行うための作業方法を見つけることができたが、それは私のシナリオにかなり具体的であるため、それはほとんどの将来の人々のために動作しない可能性があります。

本質的に、グリッドとGridItems両方ビューモデル(ページビューモデル)を共有します。これは、GridItemのバインディングが変更されているときに、ViewModelが単にバインディングを介してGridに通知できるため、ViewModelが担当しているようなものです。

私は、グリッド内バインド可能なブール値は「無効」と呼ばれました。 ViewModelがGridItemsの子バインディングを変更していたときは、Invalidateバインディングをtrueに設定して変更します。

カスタムレンダラでは、Gridに対してElementPropertyChangeがオフになるたびに、無効化が発生したかどうかを確認します&無効化がtrueに設定されました。この場合、要素のInvalidateをfalseにリセットしてから、Invalidateを呼び出します(可能な場合はDrawイベントを強制的にリロードして画面をリロードします)。

関連する問題