説明:
テキストボックスをモデルの基礎となるプロパティにデータバインドする場合:
最初: 他の多くの状態と同様に、プロパティを含むものはすべて INotifyPropertyChanged インターフェイスを実装する必要があります。これにより、オブジェクト プロパティが変更されたときに、必要なイベントが発生してビューに変更が通知されます。この点で、ビューモデルをモデルのプロパティとして使用して、ビューをデータバインドしたい特定のプロパティをカプセル化します。
2 番目: IView には、View が実装する必要がある viewmodel プロパティが含まれます。
3 番目: View は、viewmodel オブジェクトに set アクセサーのみを使用して IView プロパティを実装し、各テキスト ボックスを dto プロパティにデータバインドします。以下の例で、ビューの読み込み後にテキストボックスを手動で設定することは決してないことに注意してください。基になるモデルのビューモデル プロパティが変更されると、textbox.text の値が更新されるようになりました。これは両方の方法で機能します (2 方向のデータバインディング)。ユーザー入力でテキストボックスを編集すると、基になるモデルの dto プロパティ値が変更されます。
4 番目: プレゼンターは、ビューの読み込み時に IView のプロパティをモデルのプロパティに 1 回だけ設定します。
例: これは非常に単純化された大まかな例であり、OP が使用しているようなモデルの抽象化はありませんが、Winforms MVP でのテキスト ボックス データ バインディングの良い出発点になるはずです。本番アプリで変更するもう 1 つのことは、モデルをステートレスにし、ビューモデル (人物) をプレゼンターに移動することです。
//VIEWMODEL
public class Person : INotifyPropertyChanged
{
string _firstName;
string _lastName;
public string FirstName
{
get { return _firstName; }
set
{
if(value != _firstName)
{
_firstName = value;
NotifyPropertyChanged("FirstName");
}
}
}
public string LastName
{
get { return _lastName; }
set
{
if (value != _lastName)
{
_lastName = value;
NotifyPropertyChanged("LastName");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
//MODEL
class Model
{
Person _person;
public Person Person { get { return _person; } }
public Model()
{
//Set default value
_person = new Person(){ FirstName = "Test", LastName = "Subject" };
}
public void ChangePerson()
{
//When presenter calls this method, it will change the underlying source field and will reflect the changes in the View.
_person.FirstName = "Homer";
_person.LastName = "Simpson";
}
}
//PRESENTER
class Presenter
{
readonly View _view;
readonly Model _model;
public Presenter(View view)
{
_view = view;
_model = new Model();
_view.OnViewLoad += Load;
_view.OnChangePerson += ChangePerson;
}
private void Load()
{
_view.Person = _model.Person;
}
private void ChangePerson()
{
_model.ChangePerson();
}
}
//IVIEW
interface IView
{
Person person { set; }
event Action OnViewLoad;
event Action OnChangePerson;
}
//VIEW
public partial class View : IView
{
public View()
{
Presenter presenter = new Presenter(this);
this.Load += (s, e) => OnViewLoad(); //Shorthand event delegate
this.btnChange.Click += (s, e) => OnChangePerson(); //Shorthand event delegate
}
public event Action OnViewLoad;
public event Action OnChangePerson;
public Person person
{ //This is how you set textbox two-way databinding
set
{
//Databinding syntax: property of control, source, source property, enable formatting, when to update datasource, null value
txtFirstName.DataBindings.Add(new Binding("Text", value, "FirstName", true, DataSourceUpdateMode.OnPropertyChanged, string.Empty));
txtLastName.DataBindings.Add(new Binding("Text", value, "LastName", true, DataSourceUpdateMode.OnPropertyChanged, string.Empty));
}
}
}