c# - 如何驱动其他类中的表单事件?

标签 c# wpf

我想要以下内容:

当单击窗体上的按钮时,我要处理的事件是另一个类。因此,表单仅包含控件。

它几乎就像一个 MVC 模式: Controller 我有一个类和一个类 RegistrarTrabajador(模型)。当 Controller 检测到表单的事件时,将任务传递给模型。

这里是 Controller 类和表单:

Controller :

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();
       }
    }
}

界面:

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();
    }
}

最佳答案

您不在 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 支持通过两种方式将数据绑定(bind)到属性,因此您无需手动执行所有这些管道操作。


为了说明这一点,这里有一个小例子:

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();
    }
}

View 模型:

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.
}

关于c# - 如何驱动其他类中的表单事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529873/

相关文章:

c# - VLC 服务器与 .NET C# 的通信

c# - 使用 EnumChildWindows 确定 IntPtr 实例的位数

WPF 用户控件内存泄漏

c# - 多次显示同一模块

c# - 在输入编辑框之前如何拦截键盘输入?

c# - 将菜单项绑定(bind)到列表

c# - 在 .NET 中依赖 && 短路安全吗?

c# - Linq to SQL lambda 连接

c# - Wpf 数据虚拟化

C# WPF 应用程序在 Visual 中启动,但直接运行时无法启动