2011-01-12 9 views
5

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

+2

¿Qué tienes hasta ahora? Publica un código – decyclone

+4

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

+0

@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

Respuesta

6

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).

+4

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

13

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"); 
      } 
     } 
    } 
0

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.

Cuestiones relacionadas