2009-04-17 9 views
11

Estoy tratando de encontrar la forma correcta de obtener los datos de una ventana emergente/ventana emergente usando un patrón MVVM en Silverlight (3). Por ejemplo: tengo una página principal con un formulario de entrada de datos y quiero abrir una ventana emergente con una lista de clientes. Cuando el usuario selecciona un cliente, quiero transferir el cliente seleccionado a la página principal. Esto es lo que el (ejemplo) código que estoy usando en la actualidadVentanas plateadas de Silverlight en el patrón MVVM

página principal

public partial class MainPage : UserControl 
{ 
    public MainPageViewModel ViewModel { get; private set; } 

    public MainPage() 
    { 
     InitializeComponent(); 
     ViewModel = new MainPageViewModel(); 
     DataContext = ViewModel; 
    } 

    private void SearchCustomer_Click(object sender, RoutedEventArgs e) 
    { 
     ViewModel.SearchCustomer(); 
    } 
} 

public class MainPageViewModel: ViewModel 
{ 
    private string customer; 
    public string Customer 
    { 
     get { return customer; } 
     set { customer = value; RaisePropertyChanged("Customer"); } 
    } 

    public void SearchCustomer() 
    { 
     // Called from a view 
     SearchWindow searchWindow = new SearchWindow(); 
     searchWindow.Closed += (sender, e) => 
     { 
      if ((bool)searchWindow.DialogResult) 
      { 
       Customer = searchWindow.ViewModel.SelectedCustomer.ToString(); 
      } 
     }; 
     searchWindow.Show(); 
    } 
} 

ventana secundaria

public partial class SearchWindow : ChildWindow 
{ 
    public SearchWindowViewModel ViewModel { get; private set; } 

    public SearchWindow() 
    { 
     InitializeComponent(); 
     ViewModel = new SearchWindowViewModel(); 
     DataContext = ViewModel; 
    } 

    private void OKButton_Click(object sender, RoutedEventArgs e) 
    { 
     DialogResult = ViewModel.OkButtonClick(); 
    } 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     DialogResult = ViewModel.CancelButtonClick(); 
    } 
} 

public class SearchWindowViewModel: ViewModel 
{ 
    private Customer selectedCustomer;   
    private ObservableCollection<Customer> customers; 

    public ObservableCollection<Customer> Customers 
    { 
     get { return customers; } 
     set {customers = value; RaisePropertyChanged("Customers"); } 
    } 

    public Customer SelectedCustomer 
    { 
     get { return selectedCustomer; } 
     set { selectedCustomer = value; RaisePropertyChanged("SelectedCustomer"); } 
    } 

    public SearchWindowViewModel() 
    { 
     Customers = new ObservableCollection<Customer>(); 
     ISearchService searchService = new FakeSearchService(); 
     foreach (Customer customer in searchService.FindCustomers("dummy")) 
      Customers.Add(customer); 
    } 

    public bool? OkButtonClick() 
    { 
     if (SelectedCustomer != null) 
      return true; 
     else 
      return null; // show some error message before that 
    } 

    public bool? CancelButtonClick() 
    { 
     return false; 
    } 
} 

¿Es este el camino correcto o hay algo más "simple"?

Saludos, Rok

Respuesta

6

Más problemática aquí es el uso de Ver las condiciones y los tipos específicos en sus máquinas virtuales. Haga clic en eventos, DialogResults no debería estar en ninguna parte cerca de sus ViewModels.

Con respecto a la pregunta, que tenía una pregunta similar sobre esto aquí: Handling Dialogs in WPF with MVVM

La respuesta acepté fue el uso del patrón de Mediador de evitar esto. Echar un vistazo. :)

+2

Gracias, voy a echar un vistazo. Descubrí que lo estoy haciendo "completamente" mal y ya cambié mi código para usar comandos (vinculando a ICommand) y eliminar el resultado de diálogo de la máquina virtual. El siguiente paso es mirar el patrón de Mediator :) – rrejc

+0

Estoy de acuerdo en que el mediador es el camino a seguir. Blogueó al respecto: http://basaratali.blogspot.com/2010/12/mediator-for-mvvmlight-like-one-by.html – basarat

Cuestiones relacionadas