gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:42 25 4
gpt4 key购买 nike

我想要以下内容:

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

它几乎就像一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com