0

うまくいけば、あなたは私を助けることができます。まず、私の問題点を説明しましょう。

2つのViewModelがあります。最初のものは、例えば、いくつかのテキストボックスに情報を保存しています。

例えば

private static string _tbxCfgLogfile;
    public string TbxCfgLogfile
    {
        get { return _tbxCfgLogfile; }
        set
        {
            _tbxCfgLogfile = value;
            NotifyOfPropertyChange(() => TbxCfgLogfile);
        }
    }

もう1つのViewModelには、テキストボックスからこのデータを保存するボタンがあります。

このように見えます

public bool CanBtnCfgSave
    {
        get
        {
            return (new PageConfigGeneralViewModel().TbxCfgLogfile.Length > 0 [...]);
        }
    }

    public void BtnCfgSave()
    {
        new Functions.Config().SaveConfig();
    }

条件が満たされているかどうかを「CanBtnCfgSave」に知らせるにはどうすればよいですか?

私の最初の試みは

    private static string _tbxCfgLogfile;
    public string TbxCfgLogfile
    {
        get { return _tbxCfgLogfile; }
        set
        {
            _tbxCfgLogfile = value;
            NotifyOfPropertyChange(() => TbxCfgLogfile);
            NotifyOfPropertyChange(() => new ViewModels.OtherViewModel.CanBtnCfgSave);
        }
    }

それは動作しません。正しく覚えていれば、各ViewModelからデータを取得できますが、何の努力もせずに設定したり通知したりすることはできません。そうですか?目標を達成するために「イベントアグリゲーター」を使用する必要がありますか、それとも別の簡単な方法がありますか?

4

1 に答える 1

0

ビューモデルで何をしているのかわからない-なぜプロパティアクセサーでビューモデルをインスタンス化するのですか?

この行は何をしていますか?

return (new PageConfigGeneralViewModel().TbxCfgLogfile.Length > 0 [...]);

アーキテクチャについてあまり言及していないため、セットアップからはわかりませんが、各ビューモデルのインスタンスが必要であるため、2つ(または一方が他方を管理)を実行/管理する何かが必要です。

一方が他方を管理していて、具体的な参照を介してこれを実装している場合は、プロパティに直接アクセスしPropertyChanged、子のイベントをフックして親に通知することで、もう一方のビューモデルからフィールドを取得できます。

class ParentViewModel : PropertyChangedBase
{
    ChildViewModel childVM;

    public ParentViewModel() 
    {
        // Create child VM and hook up event...
        childVM = new ChildViewModel();

        childVM.PropertyChanged = ChildViewModel_PropertyChanged;
    }

    void ChildViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
         // When any properties on the child VM change, update CanSave
         NotifyOfPropertyChange(() => CanSave);
    }

    // Look at properties on the child VM
    public bool CanSave { get { return childVM.SomeProperty != string.Empty; } }

    public void Save() { // do stuff }
}

class ChildViewModel : PropertyChangedBase
{
    private static string _someProperty;
    public string SomeProperty
    {
        get { return _someProperty; }
        set
        {
            _someProperty = value;
            NotifyOfPropertyChange(() => SomeProperty);
        }
    }
}

もちろん、これは非常に直接的な方法です。それがCanSave機能する場合は、子VMにバインディングを作成するだけCanSaveで、親にプロパティを作成する必要がなくなります。

于 2012-12-07T11:29:24.360 に答える