ビューをロジックから分離するMVCのようなパターンがあることは知っていますが、Winformアプリケーションでそれらがどれほど一般的であるかはわかりません。
C#Winformアプリケーションの場合、Form
から始めて、UIコンポーネントを徐々に追加し、次にコンポーネントのイベント(click
、textchanged
...)関数を呼び出すか、直接ロジックを記述します。
私はそれが悪い習慣であることを知っていますが、そのようなプロジェクトをVisual Studioで開始するための最良の方法(テンプレート、フレームワーク、開始点)はわかりません。MVCが唯一の解決策ですか?どんなプロジェクトでもやるべきですか?!
開始するためのガイドラインまたは軽量フレームワークを受け取りたい。
MVVM(Model-View-ViewModel)パターンはWinforms
で使用できます
型番
public class Person
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
ViewModel
public class PersonViewModel : INotifyPropertyChanged
{
private Person _Model;
public string FirstName
{
get { return _Model.FirstName; }
set(string value)
{
_Model.FirstName = value;
this.NotifyPropertyChanged("FirstName");
this.NotifyPropertyChanged("FullName"); //Inform View about value changed
}
}
public string LastName
{
get { return _Model.LastName; }
set(string value)
{
_Model.LastName = value;
this.NotifyPropertyChanged("LastName");
this.NotifyPropertyChanged("FullName");
}
}
//ViewModel can contain property which serves view
//For example: FullName not necessary in the Model
public String FullName
{
get { return _Model.FirstName + " " + _Model.LastName; }
}
//Implementing INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
見る
public class PersonView: Form
{
//Add two textbox and one label to the form
//Add BindingSource control which will handle
//ViewModel and Views controls changes
//As viewmodel you can use any type which of course have same named properties
public PersonView(Object viewmodel)
{
this.InitializeComponents();
this.ViewModelBindingSource.DataSource = viewmodel;
this.InitializeDataBindings();
}
private void InitializeDataBindings()
{
this.TextBoxFirstName.DataBindings.Add("Text", this.ViewModelBindingSource, "FirstName", true);
this.TextBoxLastName.DataBindings.Add("Text", this.ViewModelBindingSource, "LastName", true);
this.LabelFullName.DataBindings.Add("Text", this.ViewModelBindingSource, "FullName", true);
}
}
Winformsでのデータバインディングの詳細 MSDNから
明らかに、WinFormsは、ある設計パターンをネイティブでサポートしていません。データをビューモデルに「バインド」してデータを直接更新させることができないため、機能しない可能性があるのはMVVMです。
それ以外の場合-私はMVPでWinFormsを試します-以前にそれを行ったのを見たことがあります-ここにリンクがあります https://winformsmvp.codeplex.com/