2013-10-22 55 views
2

我希望以下內容:如何驅動其他課程中的Form事件?

當在窗體上點擊一個按鈕時,我想要處理的事件是另一個類。因此,表單只包含控件。

它幾乎就像一個MVC模式:控制器我有一個類,和一個類RegistrarTrabajador(模型)。當控制器檢測到表單事件時,將任務傳遞給模型。

這裏的控制器類和形式:

控制器:

namespace RegistroDeUsuarios 
{ 
    public class Controller 
    { 
     private MainWindow vista; 
     private RegistrarTrabajador modelo; 

     public Controller() 
     { 

     } 

     public Controller(MainWindow vista, RegistrarTrabajador modelo) 
     { 
      this.vista = vista; 
      this.modelo = modelo;   
     } 

     public void btnRegistrar_Click(Object sender, RoutedEventArgs e) 
     { 
      Trabajador trabajador = new Trabajador(); 
      trabajador.setPrimerNombre(vista.txtPrimerNombre.Text); 
      trabajador.setSegundoNombre(vista.txtSegundoNombre.Text); 
      trabajador.setPrimerApellido(vista.txtPrimerApellido.Text); 
      trabajador.setSegundoApellido(vista.txtSegundoApellido.Text); 
      trabajador.setRangoTrabajador(vista.cboRangoTrabajador.SelectedItem.ToString()); 
      trabajador.setFechaNacimiento(vista.txtFechaNacimiento.Text); 
      modelo.registrarTrabajador(trabajador); 
     } 

     public void btnNuevo_Click(Object sender, RoutedEventArgs e) 
     { 
      vista.clean(); 
     } 

     public void btnSalir_Click(Object sender, RoutedEventArgs e) 
     { 
      //Application.Current.Shutdown(); 
     } 
    } 
} 

GUI:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     cboRangoTrabajador.Items.Add("Administrador"); 
     cboRangoTrabajador.Items.Add("Vendedor"); 
     cboRangoTrabajador.Items.Add("Contador"); 
     cboRangoTrabajador.Items.Add("Tecnico Mantenimiento"); 
     cboRangoTrabajador.Items.Add("Programador"); 
     cboRangoTrabajador.Items.Add("Analista"); 
     cboRangoTrabajador.SelectedIndex = 0; 
    } 

    public void setControlador(Controller controlador) 
    { 
     controlador.btnRegistrar_Click(controlador,new RoutedEventArgs()); 
     controlador.btnNuevo_Click(controlador,new RoutedEventArgs()); 
     controlador.btnSalir_Click(controlador,new RoutedEventArgs()); 
    } 

    public void clean() 
    { 
     txtPrimerNombre.Clear(); 
     txtSegundoNombre.Clear(); 
     txtPrimerApellido.Clear(); 
     txtSegundoApellido.Clear(); 
     txtFechaNacimiento.Clear(); 
     cboRangoTrabajador.SelectedItem = "Administrador"; 
     txtPrimerNombre.Focus(); 
    } 
} 
+0

討論表明不需要在標題中添加標籤。 http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles – Brian

回答

0

你不會在WPF使用MVC。您可以使用Model-View-ViewModel (MVVM)

而且

你沒有創建或操縱在WPF程序代碼UI元素。這就是XAML的用途。 請閱讀有關DataBinding

這樣的事情:

trabajador.setPrimerNombre(vista.txtPrimerNombre.Text); 
trabajador.setSegundoNombre(vista.txtSegundoNombre.Text); 

是可怕的,永遠不應該在WPF來完成。


此外,你的代碼聞起來像蹩腳的java。而不是像setPrimerNombre()方法,你應該真的使用Properties。 WPF支持雙向數據綁定屬性,所以你不需要手動完成所有這些管道。


爲了更清楚,這裏是一個小例子:

XAML:

<StackPanel> 
    <TextBox Text="{Binding Model.LastName}"/> 
    <TextBox Text="{Binding Model.FirstName}"/> 
    <Button Content="Registrar" Click="Registrar_Click"/> 
    <Button Content="Clear" Click="Clear_Click"/> 
</StackPanel> 

代碼背後:

public class MainWindow: Window 
{ 
    public MainViewModel ViewModel { get { return DataContext as MainViewModel; } } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new MainViewModel(); 
    } 

    public void Registrar_Click(object sender, RoutedEventArgs e) 
    { 
     ViewModel.Registrar(); 
    } 

    public void Clear_Click(object sender, RoutedEventArgs e) 
    { 
     ViewModel.Clear(); 
    } 
} 

視圖模型:

public class MainViewModel: ViewModelBase //You should have some ViewModelBase implementing INotifyPropertyChanged, etc 
{ 
    private Trabajador _model; 
    public Trabajador Model 
    { 
     get { return _model; } 
     set 
     { 
      _model = value; 
      NotifyPropertyChange("Model"); 
     } 
    } 

    public void Registrar() 
    { 
     DataAccessLayer.Registrar(Model); 
    } 

    public void Clear() 
    { 
     Model = new Trabajador(); 
    } 
} 

型號:

public class Trabajador: ModelBase //ModelBase Should also implement INotifyPropertyChanged 
{ 
    private string _lastName; 
    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      _lastName = value; 
      NotifyPropertyChanged("LastName"); 
     } 
    } 

    private string _firstName; 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      _firstName = value; 
      NotifyPropertyChanged("FirstName"); 
     } 
    } 

    //... And so on. 
} 
+0

我是否會因爲詢問是否存在*非蹩腳的Java而發火? – dwerner

+0

@dwerner不,實際上存在一個非蹩腳的java,它被稱爲'C#'。 –

+0

是的,即時通訊Java程序員,這是我在C#中的第一個「應用程序」,我從來不知道MVVM。我很抱歉我的「蹩腳的java代碼」xD。 對不起我的英文.. – user2909121

0

不知道已經完全明白你的意思,但我想你想知道它是建設多層WPF應用程序的最佳途徑。

如果這是正確的,那麼MVVM模式就是你正在尋找的。 Here is a great link瞭解它是如何工作的,並開始玩它!

相關問題