2017-12-22 30 views
0

私は、同じオブジェクトのいくつかのコントロールパネルであるUWPアプリケーションで作業しています。それらをPlateオブジェクトと呼んでいます。複数のフレームと複数の対応するオブジェクト間のデータバインディングを維持する方法はありますか?

機能的には、特定のプロパティを持つPlateオブジェクトを削除し、現在使用可能なすべてのPlateオブジェクトを対応する一意のプロパティとそれらを変更するコントロールと共にメインページに表示する必要があります。

私がこれを実装したのは、メインページ上にグリッドを作成し、利用可能な各プレートに対してフレームをグリッド列に追加し、各フレームがカスタムのPlateViewページにナビゲートして、基本的に水平PlateView列のリスト。

私の問題は、各プレートから対応するPlateViewへの各コントロール/プロパティの双方向データをバインドできるようにすることです。

今、完全なライフサイクルを通してアプリケーションの複数の部分からこのマスターリストを取得して変更する必要があるため、すべてのプレートのリストをApp.csのパブリック変数として保存します。

UWPのドキュメントでデータバインディングの説明を理解した方法として、PlateオブジェクトでINotifyPropertyChangedを実装するか、実装する別のPlateViewModelクラスを作成できます。

PlateViewを実装すると、PlateViewはそのViewModelをList内のPlateの正しいインデックス(this.ViewModel = App.plateList [1])に設定しますが、コピーを作成すると仮定します...?したがって、PlateViewで変数を変更すると、実際にはApp.cのPlateオブジェクトは変更されません。

新しいPlateViewModelクラスでは、私は同じ問題はないが、PlateViewModelクラスの中でどのように理解できないのか分かりません。例えば、MSのマニュアルは示しています。構文:私はPlateViewModel内の内部プレートのオブジェクトを設定しても

public class RecordingViewModel 
{ 
    private Recording defaultRecording = new Recording(); 
    public Recording DefaultRecording { get { return this.defaultRecording; } } 
} 

、私はXAML {バインド... X}から変数を呼び出す必要はありませんか?だから私は正しいPlateからPlateViewModelにすべての変数のコピーを作成しなければならず、App.csの元のPlateオブジェクトにリンクする必要はありませんか?

ありがとうございます!

答えて

0

MVVMについての議論を一切経ずに簡単に質問に答えるには、追加のViewModelプロパティをバインドしてリストの新しいインスタンスを作成しないでください。私は何だろうと、(この場合はApp.csプロパティは、あなたのモデルである)ゲッターとセッターを使用してモデルを提示ビューモデルのプロパティを作成することです:

のViewModel

public List<Plate> MyPlates 
{ 
    get 
    { 
     return ((App)Application.Current).MyGlobalListofPlates; 
    } 
    set 
    { 
     ((App)Application.Current).MyGlobalListofPlates = value; 
     OnPropertyChanged("MyPlates"); 
    } 
} 

そのコード新しいオブジェクトではないことが明らかになり、データの変更が許可されているかどうかを制御できます。別のオプションは、コンストラクタでプロパティを割り当てることです。これは新しいオブジェクトも作成しません。これはオリジナルへの言及であり、あなたが行った変更はどこにでも反映されます。

public List<Plate> MyPlates { get; set; } 

public MyViewModel() //Constructor 
{ 
    MyPlates = ((App)Application.Current).MyGlobalListofPlates; 
} 

この2番目のコードブロックには、INotifyがないので問題があります(双方向バインディングであれば問題ありません...)。とにかく、オブジェクトを別のオブジェクトに割り当てるだけで参照が作成されることを示しています。あなたは間違いなく、C#で値型と参照型を読み上げたいと思っています。ほとんどの場合、C#で "ThisObject = ThatObject"を実行すると、メモリ内の同じオブジェクトへのポインタが作成されます。

関連する問題