Ligé la propiedad "WindowState" de mi ventana principal a mi ViewModel para cambiar el estado de la ventana por un comando, pero la primera vez que minimizo el la ventana se minimiza como lo hace una hoja de trabajo en un archivo de Excel. ¿Existe una solución para esto o una forma correcta de enlazar la propiedad "WindowState" a mi ViewModel para que la ventana se minimice correctamente?Enlazando la propiedad "WindowState" de una ventana en WPF usando MVVM
Respuesta
No creo que usted debe preocuparse por el estado de la ventana en un modelo de vista, es totalmente erróneo, porque una capa de nivel inferior está al tanto de un mayor nivel de capa (por lo tanto, la separación incorrecta de las preocupaciones (SOC)).
Lo que normalmente hago en este caso es suscribirme a los cambios en el modelo de vista desde el código subyacente del control o ventana (por lo tanto, la vista) que contiene el modelo de vista. En este caso, es válido escribir código en el código subyacente porque solo se utiliza en la vista (y, por lo tanto, el código subyacente es la ubicación perfecta para esta lógica, que realmente no desea probar en la unidad).
Si bien esto generalmente es cierto, también es posible que el modelo de vista exponga una propiedad no relacionada con 'WindowState' que debería dictar su valor. Por ejemplo, uno de mis modelos de vista contenía el booleano 'ShowResults'. Quería que esto cambiara mi 'WindowState' a' Maximize', así que creé un BoolToWindowStateConverter. – Pakman
este es un trabajo de prueba que se probó con Relaying Command Logic. Obtendrá más detalles en WPF Apps With The Model-View-ViewModel Design Pattern.
<Window x:Class="WpfMvvmTestCSharp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:WpfMvvmTestCSharp"
Title="Window1" Height="300" Width="300" WindowState="{Binding CurWindowState, Mode=TwoWay}">
<Window.DataContext>
<vm:Window1ViewModel/>
</Window.DataContext>
<Grid>
<Button Command="{Binding CmdMax}" Height="23" Margin="12,25,0,0" Name="button1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75">Maximize</Button>
<Button Command="{Binding CmdMin}" Height="23" Margin="101,25,102,0" Name="button2" VerticalAlignment="Top">Minimize</Button>
<Button Command="{Binding CmdRes}" Height="23" HorizontalAlignment="Right" Margin="0,25,13,0" Name="button3" VerticalAlignment="Top" Width="75">Restore</Button>
</Grid>
</Window>
y en el de Windows modelo de vista
class Window1ViewModel:ViewModelBase
{
public Window1ViewModel()
{
CurWindowState = WindowState.Maximized;
}
public ICommand CmdMax
{
get { return new RelayCommand(param => onCmdMax()); }
}
void onCmdMax()
{
CurWindowState = WindowState.Maximized;
}
public ICommand CmdMin
{
get { return new RelayCommand(param => onCmdMin()); }
}
void onCmdMin()
{
CurWindowState = WindowState.Minimized;
}
public ICommand CmdRes
{
get { return new RelayCommand(param => onCmdRes()); }
}
void onCmdRes()
{
CurWindowState = WindowState.Normal;
}
private WindowState _curWindowState;
public WindowState CurWindowState
{
get
{
return _curWindowState;
}
set
{
_curWindowState = value;
base.OnPropertyChanged("CurWindowState");
}
}
}
Otra opción a considerar está suscribiendo tanto a través de un comando y un evento para codificar detrás, por ejemplo:
<Button Command="{Binding SnoozeCommand}" Click="Button_Click">Snooze</Button>
El comando en este caso afecta a la máquina virtual. El evento Click solo cambia el estado de la ventana.
- 1. Enlazando un TextBlock a la propiedad de una ventana
- 2. WPF: Enlazando una etiqueta a una propiedad de clase
- 3. WPF ReadOnly Propiedades de dependencia usando MVVM
- 4. WPF Agrupación con una colección usando MVVM
- 5. Andamios para WPF usando MVVM?
- 6. Cómo abrir una nueva ventana usando MVVM Light Toolkit
- 7. WPF Activación de desencadenador a la propiedad MVVM
- 8. Enlazando un WGT DataGridComboBoxColumn con MVVM
- 9. WPF usando MVVM: DataBinding con RelativeSource
- 10. Ventana de error show modal en MVVM WPF
- 11. Ejemplo de diálogo WPF MVVM
- 12. Cambiar la imagen usando el disparador WPF MVVM
- 13. Usando WPF DataGridComboBoxColumn con MVVM - Enlace a la propiedad en ViewModel
- 14. WPF: la ventana se mantiene minimizada incluso cuando se establece WindowState explícitamente
- 15. Configuración del foco en un control en WPF usando MVVM
- 16. Enlazando a una segunda propiedad si la primera es "indefinida"
- 17. Restaurar WindowState de Minimized
- 18. WPF (MVVM): ¿Cerrar una vista desde Viewmodel?
- 19. WPF y MVVM: ¿Algún ejemplo usando VB.Net?
- 20. MVVM + WPF + Popup = sin pista
- 21. Enlazando HttpPostedFileBase usando Ajax.BeginForm
- 22. Cómo vincular una propiedad a un cuadro de texto usando MVVM y MVVM toolkit?
- 23. WPF MVVM Dudas
- 24. Localización de aplicaciones WPF basadas en MVVM
- 25. Algunas preguntas MVVM (WPF C#)
- 26. Wpf UserControl y MVVM
- 27. Consulte la ventana activa en WPF?
- 28. WPF MVVM Property Change Animation
- 29. MVVM y la propiedad TextoTexto de TextBox
- 30. cómo llamar al evento Loaded de una ventana en WPF MVVM?
¿Qué tienes hasta ahora? Publica un código – decyclone
Sin saber el trasfondo de lo que está tratando de hacer, parece que puede llevar la cosa de ViewModel un paso demasiado lejos. Las cosas que son estrictamente lógica de UI son completamente aceptables en código subyacente y, de hecho, no tienen ningún negocio en ViewModel. Yo diría que esto incluye cosas como el enfoque y el estado de la ventana. – Josh
@Josh Enstein Paso a usar el código como lo dijiste, ahora funciona perfectamente. Lo que trato de hacer es ocultar el botón de la barra de tareas cuando la ventana está minimizada y usar un elemento del menú adjunto al icono de la barra de tareas para recuperar la ventana. – norlando