WPF MVVM - Jak wyświetlić widok z MainWindowViewModel po kliknięciu na przycisk [duplikat]

Możliwy duplikat:
najlepsze podejście do tworzenia nowego okna w WPF przy użyciu MVVM

Witajcie Przyjaciele,

Mam dwa widoki MainWindowView i AddCustomerView . Mam menu zawierające przyciski w MainwindowView.xmal.

Jak mogę popup AddCustomerView z MainWindowViewModel klikając na przycisk.

Moja Aplikacja.xmal.cs Dla kodu startowego jest..
base.OnStartup(e);
MainWindow window = new MainWindow();
var viewModel = new MainWindowViewModel();
window.DataContext = viewModel;
window.Show();

Jaki jest kod do wyświetlania AddCustomerView w buttonexecute code.

 public void AddNewCustomerWindowExecute() //This is button handler
 {
     // How to show AddCustomerView from MainWindowViewModel
 }
 3
Author: Community, 2011-04-29

2 answers

Uchwyć to w widoku

Prawdopodobnie najprostsze podejście.

private void AddCustomerView_Click(object sender, RoutedEventArgs e)
{
    AddCustomerView view = new AddCustomerView(data);
    view.Show();
}

ViewModel wyświetla Zdarzenie

Ma to jedną wadę: wymaga wielu ręcznych kodowań.

public class MainWindowViewModel 
{
    public event EventHandler AddCustomerViewShowed;

    public void AddNewCustomerWindowExecute()
    {
        if (AddCustomerViewShowed != null)
            AddCustomerViewShowed(this, EventArgs.Empty);
    }
}

Uchwyć to w widoku

var viewModel = new MainWindowViewModel();
viewModel.AddCustomerViewShowed += (s, e) => new AddCustomerView(data).Show();

Kontroler, który obsługuje wszystkie Twoje widoki

public class Controller : IController
{
    public void AddCustomer()
    {
        AddCustomerView view = new AddCustomerView(data);
        view.Show();
    }
}

public class MainWindowViewModel 
{
    IController controler;

    public MainWindowViewModel(IController controller)
    {
        this.controller = controller;
    }

    public void AddNewCustomerWindowExecute()
    {
        controller.AddCustomer();
    }
}

Wzór mediatora

Niektóre frameworki MVVM (np.MVVM Light ) używają tego wzorca.

public class App // or in the view or somewhere else
{
    public void RegisterMessenger()
    {
        Messenger.Default.Register<AddCustomerMessage>(this, ProcessAddCustomerMessage);            
    }

    private void ProcessAddCustomerMessage(AddCustomerMessage message)
    {
        AddCustomerView view = new AddCustomerView(data);
        view.Show();
    }
}

public class MainWindowViewModel 
{
    public void AddNewCustomerWindowExecute()
    {
        Messenger.Default.Send(new AddCustomerMessage(...));
    }
}
 20
Author: mak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 08:19:51

Zobacz ten "deep dive MVVM video". Laurent Bugnion pokazuje pojęcie IDialogService i wyjaśnia pojęcia bardzo dobrze... dodatkowo kod źródłowy powinien być również dostępny... Pojęcia te stosuje się również do wpf

Http://channel9.msdn.com/Events/MIX/MIX11/OPN03

HTH

 3
Author: silverfighter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 08:03:06