2

UserAccountWinRT プロジェクトに静的クラスがあります。このクラスには、現在ログインしているユーザーに関するさまざまな静的プロパティ (ユーザー名、電子メール アドレスなど) が含まれています。バインディングを使用して任意のビューからこの情報を利用できるようにする必要があります (例 - ユーザー名を渡す - アプリ内の 1 つのページにパーソナライズされたメッセージを表示したい"Welcome, {0}") が、これらの条件が満たされていることを確認する必要があります。

  1. 正しいMVVMパターンの方法で実装する
  2. アプリが設定チャームを介して実行されているときにユーザーが別のアカウントに切り替えると、バインドされたフィールド (メッセージなど) が新しいデータで自動的に更新されます。

UserAccountViewModel必要なプロパティを持つクラシック ビュー モデルであり、静的クラスから手動で更新されるglobal のようなものを作成することは可能であると考えましたが、それは可能UserAccountな限り優れたソリューションではないようです。

これを達成し、上記の両方の条件を満たすためのより良い方法を考えていただけますか?

どんな助けでも大歓迎です。

編集: 同様の状況が、必要なさらに別のクラス - NetworkStatus - で発生しました。このクラスには、アプリが接続されているかどうかを知るために IsInternetAvailable がありますが、このブール値を使用して、アプリ内のさまざまなボタンの IsEnabled プロパティにバインドする必要があります。

4

1 に答える 1

2

s 他のすべての ViewModel が継承する Base ViewModel を作成します。すべてのViewModelがすでにアクセスできるようになっているため、すべてのアクセスのために静的にする必要はありません。バインディングでは、 base.Propertyも指定しません。

このデータを入力するためのプロパティ機能を含む抽象ビュー モデル。

public abstract class UserAccountViewModel : ObservableObject, IViewModel
{
    //use private member and do a RaisePropertyChanged("Username")
    public string Username { get; set; }

    private void GetUserInformation()
    {
        Username = BusinessLogic.GetUsername();
    }
}

ViewModels にそれを継承させます。

public class OtherViewModel : UserAccountViewModel { }

また、 OtherView.xamlの親プロパティに直接バインドできます。

<TextBlock Text="{Binding Path=Username, Mode=OneWay}" />

BusinessLogic クラスには、ユーザー名を取得する静的な GetUsername() メソッドがあります。ワークロードを繰り返さないために、取得は 1 回だけで、多く提供します。そのため、リフレッシュの概念が呼び出されるまで、ビジネスロジックに静的に保存することになります。

または、必要なデータを収集する 1 つの ViewModel を作成してから、ユーザーEventAggregatorまたはこれを必要とする他のすべての ViewModel に渡したいものを作成できます。これにより、静的なビジネスロジックのアイデアが削除されます。Prism の EventAggregator を使用すると、ViewModel がサブスクライブし、1 つ (または複数) のイベントを発行して、それに付随するオブジェクト/データを含めることができます。したがって、これらの他の ViewModel はサブスクライブしてすぐに受け取ることができます。または、双方向通信を行い、ViewModel を「要求」してから「応答」を取得することもできます。それを利用できるかどうか、または独自に作成する必要があるかどうかはわかりませんが、概念は有効であり、少なくとも UserInfo オブジェクトを渡すイベントで実行できます。

于 2013-08-09T12:11:30.910 に答える