0

私の MainViewModel には、次のようなプロパティがあります。

private bool _IsSkinNight = true;
    public bool IsSkinNight
    {
        get { return _IsSkinNight; }
        set 
        {
            _IsSkinNight = value;

            RaisePropertyChanged("IsSkinNight");
            RaisePropertyChanged("WindowBackColor");
            RaisePropertyChanged("StyleImage");
        }
    }

ご覧のとおり、この 1 つのプロパティを使用して他のプロパティを発生させます。これにより、UI の変更がはるかに簡単になります。特にアイテムを追加する予定です。

ただし、WPF ページにも更新が必要なプロパティがあります。ただし、別のページにあるため、その ViewModel も別です。したがって、このプロパティは RaisePropertyChanged を呼び出すことができず、ページ内のプロパティは IsSkinNight の状態を確認できません。

では、異なる ViewModel 間を行き来する最善の方法は何でしょうか? さらにページを追加していきます。では、すべての ViewModel がアクセスできるユニバーサル プロパティのようにする方法はありますか?

ありがとう

4

3 に答える 3

3

私が使いたくない場合でも、おそらく EventAgregators を調べる必要があります。

基本的に、MainViewModel でイベントを発生させることができ、他のビュー モデルでは、このアグリゲーターの 1 つ以上のイベントに登録できます。

ただし、そのようなイベントを発生させるとコール スタックがなくなるため、デバッグが非常に難しくなる可能性があるため、非常に軽く使用することを強くお勧めします。

于 2013-02-08T16:09:52.863 に答える
0

そのような場合、「グローバル」プロパティを追跡するために一種の Context クラスを作成することがあります。このクラスはシングルトンとして登録する必要があります。

public class SkinContext : ISkinContext {
    private bool _IsSkinNight = true;
    public bool IsSkinNight
    {
        get { return _IsSkinNight; }
        set 
        {
            _IsSkinNight = value;

            RaisePropertyChanged("IsSkinNight");
            RaisePropertyChanged("WindowBackColor");
            RaisePropertyChanged("StyleImage");
        }
    }

NotifyPropertyChanged次に、コンテキストを認識し、イベント (または作成したカスタム イベント)をサブスクライブする必要がある各 ViewModel にこのクラスを挿入します。

public class SomeViewModel {
    public SomeViewModel(ISkinContext context){
        context.OnPropertyChanged += (s,e) => { /*Raise other notification and whatnot*/ }
    }
}
于 2013-02-08T16:37:23.577 に答える