アプリケーションページ間でデータを渡す際のテクニックとパターン
データの受け渡しがイベント ドリブンの場合 (つまり、サーバーからプッシュされたデータを受信したときに通知したい場合)、弱いイベントを使用します。Prism の EventAggregator は、多くの実装の 1 つです。
データの受け渡しが一定である場合は、DataContext を XAML ツリーに流し、単純にバインドを使用します。
つまり、他のより具体的な UserControls を使用する「マスター」UserControl がある場合、それらの DataContext を設定しないでください。それらはマスターのものを継承し、すべて問題ありません。
機能を分離したい場合は、マスターのビューモデルで合成を使用してください。
ビューモデルを開始する場所
純粋主義者は、XAML で直接インスタンス化するように指示します。私はほとんどそれをしません。
まず第一に、ViewModels は通常サービスを必要とし、それらはコンストラクター パラメーターとして渡されるか、コンストラクターで MEF を介して注入されます。
今、私たちは難しいことをすることができますが、何の利益がありますか? ビューのコード ビハインドで ViewModel を取得したり、コンストラクターに挿入したりすることはまったく問題ありません。
共通のアプリケーション データを格納する場所 (複数のビューモデル間で共有)
データがグローバルの場合: 静的クラス/プロパティを使用
します。XAML では、 を介してアクセスできます{x:Static my:StaticClass.StaticProperty}
。入れ子になったクラス/列挙型に到達する場合は、+
代わりに使用します.
データがすべてではなく複数の ViewModel 間でのみ共有される場合は、ビューモデルで継承/構成をコントローラー パターンと共に使用します。
経験から集めたその他のヒント:
例:
public class VisibilityBinding : MultiBinding, IMultiValueConverter
{
public VisibilityBinding()
{
var isSomething = new Binding("IsSomething");
isSomething.ElementName = myUsrCtrl;
this.Bindings.Add(isSomething);
//Add more bindings
this.Converter = this;
}
//Implement IMultiValueConverter to compute a System.Visibility from the bound values.
}
XAML では次のようになります。
<TextBox Visibility={customMrkup:VisibilityBinding} />
- DALに至るまで、データの重複は絶対に避けてください。I(Multi)ValueConverter を介して推測できるフィールドを同期すると、非常に複雑になります。
例:音声ファイルがあります。開始時刻、終了時刻、および期間があります。これら 3 つのプロパティのいずれかを取り除くと、3 番目のプロパティが推測できます。
他にもヒントを思いついたら、戻ってきて追加します。
お役に立てれば!