2013-10-22 23 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了解它是如何工作的,并开始玩它!

相关问题