2011-04-12 12 views
7

soy nuevo en MVVM y tratando de encontrar la manera de cerrar una ChildWindow con el tradicional Cancelar botón utilizando MVVM Light Toolkit.Cómo cerrar una ChildWindow con el botón Cancelar usando MVVM Light Toolkit

En mi ChildWindow (StoreDetail.xaml), que tengo:

<Button x:Name="CancelButton" Content="Cancel" Command="{Binding CancelCommand}" /> 

En mi ViewModel (ViewModelStoreDetail.cs), tengo:

public ICommand CancelCommand { get; private set; } 

public ViewModelStoreDetail() 
{ 
    CancelCommand = new RelayCommand(CancelEval); 
} 

private void CancelEval() 
{ 
    //Not sure if Messenger is the way to go here... 
    //Messenger.Default.Send<string>("ClosePostEventChildWindow", "ClosePostEventChildWindow"); 
} 

Respuesta

0

Tenga una mirada en this articleon MSDN. A mitad de camino hay un enfoque sobre cómo hacer esto. Básicamente usa cualquiera de los usos WorkspaceViewModel o implementa una interfaz que expone y evento RequestClose

Luego dentro del DataContext de la ventana (si está configurando el ViewModel en él) puede adjuntarlo al evento.

Este es un extracto del artículo (Figura 7). Puede ajustarlo para satisfacer sus necesidades.

// In App.xaml.cs 
protected override void OnStartup(StartupEventArgs e) 
{ 
base.OnStartup(e); 

MainWindow window = new MainWindow(); 

// Create the ViewModel to which 
// the main window binds. 
string path = "Data/customers.xml"; 
var viewModel = new MainWindowViewModel(path); 

// When the ViewModel asks to be closed, 
// close the window. 
viewModel.RequestClose += delegate 
{ 
    window.Close(); 
}; 

// Allow all controls in the window to 
// bind to the ViewModel by setting the 
// DataContext, which propagates down 
// the element tree. 
window.DataContext = viewModel; 

window.Show(); 
} 
0

Ha sido un tiempo desde que he usado WPF y MVVMLight pero sí creo que haría uso del mensajero para enviar el evento cancel.

0

En MVVM Light Toolkit lo mejor que puedes hacer es usar Messenger para interactuar con View.

Simplemente registre el método close en el View (normalmente en el código detrás del archivo) y luego envíe la solicitud para cerrar una ventana cuando la necesite.

1
private DelegateCommand _cancelCommand; 

public ICommand CancelCommand 
{ 
    get 
    { 
     if (_cancelCommand == null) 
      _cancelCommand = new DelegateCommand(CloseWindow); 
     return _cancelCommand; 
    } 
} 

private void CloseWindow() 
{ 
    Application.Current.Windows[Application.Current.Windows.Count - 1].Close(); 
} 
0

Aquí hay algunas maneras para lograrlo.

  1. Envíe el mensaje a su childwindow y establezca DialogueResult en false en childwindow code-behind.
  2. Hacer propiedad de DialogueResult y vincularla con la ventana infantil Dialoue CLR, configurarlo en el método CancelEval de CancelCommand.
  3. Crea el objeto de Childwindow y establece DialogueResult false en CancelEval.
1

Si visualizó su ventana secundaria llamando a ShowDialog(), simplemente puede establecer la propiedad IsCancel de su control de botón en "True".

<Button Content="Cancel" IsCancel="True" /> 

Pasa a ser lo mismo que hacer clic en el botón X en la ventana, o presionar ESC en el teclado.

0

Llegué tarde a la fiesta pero pensé en agregar mi opinión.Los préstamos de la respuesta de user841960:

public RelayCommand CancelCommand 
{ 
    get; 
    private set; 
} 

continuación:

SaveSettings = new RelayCommand(() => CloseWindow()); 

continuación:

private void CloseWindow() 
{ 
    Application.Current.Windows[Application.Current.Windows.Count - 1].Close(); 
} 

Es un poco más limpio que el uso de un ICommand y funciona igual de bien.

lo tanto, para resumir todo, la clase de ejemplo se vería así:

public class ChildViewModel 
{ 
    public RelayCommand CancelCommand 
    { 
     get; 
     private set; 
    } 

    public ChildViewModel() 
    { 
     SaveSettings = new RelayCommand(() => CloseWindow()); 
    } 

    private void CloseWindow() 
    { 
     Application.Current.Windows[Application.Current.Windows.Count - 1].Close(); 
    } 
} 
+0

dónde estaría el SaveSettings = ... ir? – admiral142

+0

En el constructor de ViewModel. Se puede encontrar un ejemplo completo de esto [aquí] (http://msdn.microsoft.com/en-us/magazine/dn237302.aspx) junto con la documentación de Command, RelayCommand y EventToCommand. – DanteTheEgregore

Cuestiones relacionadas