Dann schau dir objektorientierte Programmierung an, ohne das Wissen wirst Du nicht weit kommen.
Was ich beschrieben habe, sähe ungefähr so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| public class MyViewModel { public string MyText { get; set; }
public void DoSomething() { } }
public class MyView : Form { public MyViewModel ViewModel { get; set; }
private void button1_click(object sender, EventArgs e) { ViewModel.DoSomething();
MyTextBox.Text = ViewModel.MyText; } }
public class CoolClass { public void ShowMyViewDialog() { var myViewModel = new MyViewModel(); var myView = new MyView() { ViewModel = viewModel }; myView.ShowDialog(); } } |
Mit WPF sieht das dann etwas anders aus, da gibt's dann z.B. keine Methode "DoSomething" mehr, sondern ein Command "DoSomethingCommand", an das meine View dann bindet.
Zusätzlich kann man dann noch alles hinter Interfaces abstrahieren:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| public interface IMyViewModel { string MyText { get; set; } void DoSomething(); } public interface IView { void Show(); void ShowDialog(); } public interface IMyView : IView { IMyViewModel ViewModel { get; set; } }
public class CoolClass { public void ShowMyViewDialog() { var myView = ViewFactory.CreateView<IMyView>(); var myViewModel = new MyViewModel(); myView.ViewModel = myViewModel; myView.ShowDialog(); } } |
Natürlich musst Du die Interfaces dann auch implementieren, das hab ich mir jetzt gespart.
Die Variante mit den Interfaces hat den Vorteil, dass Du nur noch mit Interfaces arbeitest und nicht mehr wissen musst, wie alles dahinter aus sieht.
Jede View muss dann nur irgendwie der ViewFactory bekannt gemacht werden, wie die View dann aus sieht, ob es WinForms, WPF, ASP.NET oder die Konsole, die am Ende angezeigt wird, ist völlig egal.
PS:
In der View sollte natürlich noch eine Kontrolle eingebaut werden, dass die View immer ein ViewModel bekommt. Man kann das ViewModel z.B. auch direkt über den Konstruktur abfragen, allerdings funktioniert der Designer dann nicht mehr, außer Du legst noch einen parameterlosen Konstruktor an.