2

以下を希望します。

フォームのボタンをクリックすると、イベントを別のクラスで処理したい。したがって、フォームにはコントロールのみが含まれます。

これはほとんど MVC パターンのようなものです: Controller クラスと、クラス RegistrarTrabajador (Model) があります。コントローラがフォームのイベントを検出すると、タスクをモデルに渡します。

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

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

2 に答える 2

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.
}
于 2013-10-22T23:07:36.030 に答える
0

あなたの言いたいことを完全に理解しているかどうかはわかりませんが、WPF アプリケーションをレイヤーで構築する最良の方法を知りたいと思います。

そうであれば、MVVM パターンは間違いなくあなたが探しているものです。これは、それがどのように機能するかを理解し、それを試してみるのに最適なリンクです!

于 2013-10-22T23:07:59.790 に答える