3

WPF の初心者として、私は最近 MVVM 旅行を開始しました。MVVM が必要な理由についての当初の意図は理解できますが、実装の詳細のいくつかは依然として私を大いに混乱させます。

これが私の質問の1つです:

modelプロパティをView経由してエクスポートするにはどうすればよいですかViewModel

ここで私の考えの一部を示すことができますので、あなたの見解を私と共有してください。

これが私の実装の1つです:

    class MyModel : INotifyPropertyChanged
    {
        private String _name;
        public String Name
        {
            get { return _name; }
            set 
            {
                if (_name != value)
                {
                    _name = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                    }
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

    class MyViewModel
    {
        private MyModel _model;

        public MyModel Model
        {
            get { return _model; }
            set { _model = value; }
        }
    }

これの問題は、ビューをモデルから切り離していないことだと思います。また、ビューは、バインディング プロセスを実行するために、モデルの実装に関するすべての詳細を知る必要があります。Model そして、私の意見では、プロパティを直接エクスポートして表示するViewModelことは、良いデザインとして扱うことはできません.

ですから、このトピックに関するデザインに関するあなたの経験を共有していただければ幸いです。

Listところで、ビューモデルからビューへのオブジェクトなど、多くのオブジェクトをエクスポートする場合、MyModelモデルからビューを分離するためにこれをどのように実装できますか?

4

3 に答える 3

5

モデルではありませんが、ViewModel は INotifyPropertyChanged を実装する必要があります。次に、ビューでバインディングを使用して、ビューモデルからデータを取得できます。

View / XAMLには次のようなステートメントがあります

... Content="{Binding myViewModelProperty}" ... 

あなたが拘束しているものに応じて。

myViewModelProperty は ViewModel のパブリック プロパティである必要があります

public string myViewModelProperty { get; set; }

ビューで更新を取得するには、セッターで RaiseNotifyPropertyChanged (またはハンドラーが呼び出されたもの) を呼び出すことを忘れないでください。

private string myViewModelField;

public string myViewModelProperty 
{ 
   get
   {
        return myViewModelField;
   }
   set
   {
       myViewModelField = value;
       RaiseNotifyPropertyChanged(() => myViewModelProperty);
   }
}

** アップデート **

リストは通常​​、 を介して「エクスポート」されObservableCollection<Type>ます。理想的Typeには、ビューに表示されるモデルからのデータで作成された ViewModel がここにあります。AdapterViewModelは、モデルとビューの間にあると想像できます。

于 2013-04-04T06:15:37.427 に答える
2

これは厳密な規則ではありませんが、私の場合、ViewModel に INotifyPropertyChanged を実装し、モデルを単純な POCO のままにしておくことを好みます。

ViewModel でモデルのプロパティを「繰り返す」のは煩わしい場合がありますが、次のようになります。

  1. 通常、すべてのプロパティをビューに公開する必要はありません。
  2. VM にユーザー入力の検証などのコードを追加し、モデルを「クリーン」に保つことができます。

したがって、あなたの例では次のようになります。

   class MyModel
    {
        public String Name
        {
            get;
            set;
        }     
    }

    class MyViewModel : ViewModelBase //let's say you have this base class in your framework
    {
        private MyModel model;

        public MyViewModel(MyModel model)
        {
            this.model = model;
        }

        public string Name 
        {
            get
            {
                 return this.model.Name;
            }

            set
            {
                 if(IsValidInput(value)
                 {
                     this.model.Name = value;
                     this.RaisePropertyChanged("Name"); // the ViewModelBase  base class provide this helper.
                 }
            }       
        }    
    }

2 番目の質問について、ObservableCollectionは通常、モデルのコレクションをビューに公開するための優れた方法です。

class ContactListViewModel
{
    public ObservableCollection<MyModel> Contacts { get; private set;}
}
于 2013-04-04T06:41:13.860 に答える
0

Model.Name を使用して、ビューでプロパティをバインドするだけです。

于 2013-04-04T06:09:54.663 に答える