2011-01-12 10 views
5

Ich habe die "WindowState" -Eigenschaft meines Hauptfensters an mein ViewModel gebunden, um den Status des Fensters durch einen Befehl zu ändern, aber beim ersten Mal minimiere ich den Fenster minimiert es wie ein Arbeitsblatt in einer Excel-Datei. Gibt es eine Arbeit für diese oder eine korrekte Möglichkeit, die "WindowState" -Eigenschaft an mein ViewModel zu binden, damit das Fenster korrekt minimiert?Die "WindowState" -Eigenschaft eines Fensters in WPF mit MVVM binden

+2

Was hast du bisher? Veröffentlichen Sie einen Code. – decyclone

+4

Ohne den Hintergrund dessen zu kennen, was Sie versuchen zu tun, klingt es, als ob Sie das ViewModel-Ding einen Schritt zu weit machen. Dinge, die ausschließlich UI-Logik sind, sind in Code-Behind völlig akzeptabel und haben tatsächlich im ViewModel nichts zu suchen. Ich würde sagen, dass dies Dinge wie Fokus und Fensterzustand beinhaltet. – Josh

+0

@Josh Enstein Ich benutze den Code hinterher wie du gesagt hast, jetzt funktioniert es perfekt. Was ich versuche, ist, die Taskleiste zu verstecken, wenn das Fenster minimiert ist, und ein Menüelement zu verwenden, das an das Taskleistensymbol angehängt ist, um das Fenster zurück zu bringen. – norlando

Antwort

6

Ich glaube nicht, Sie über das Fenster Zustand in einer Ansicht Modell kümmern sollen, dann ist es völlig falsch, weil eine niedrigere Ebene Schicht eines höheren bewusst ist Ebene (also falsche Trennung von Anliegen (SOC)).

Normalerweise mache ich in diesem Fall Änderungen im Ansichtsmodell aus dem Code-Behind des Steuerelements oder Fensters (also der Ansicht), das das Ansichtsmodell enthält. In diesem Fall ist es zulässig, Code in den Code-Behind zu schreiben, da er nur in der Ansicht verwendet wird (und daher ist der Code-Behind der perfekte Ort für diese Logik, die Sie wirklich nicht testen wollen).

+4

Während dies allgemein zutrifft, ist es auch möglich, dass das Ansichtsmodell eine Eigenschaft freigibt, die nicht mit "WindowState" in Beziehung steht und dessen Wert diktieren sollte. Zum Beispiel enthielt eines meiner Ansichtsmodelle das Boolean 'ShowResults'. Ich wollte, dass mein 'WindowState' auf' Maximize' gesetzt wurde, also habe ich einen BoolToWindowStateConverter erstellt. – Pakman

13

Dies ist ein Beispiel arbeiten um das mit Relaying Command Logic getestet. Sie erhalten mehr Details über 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> 

und in dem Windows-Ansichtsmodell

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

Eine weitere Option ist die Anmeldung zu betrachten sowohl über einen Befehl und ein Ereignis hinter mir zu codieren, z:

<Button Command="{Binding SnoozeCommand}" Click="Button_Click">Snooze</Button> 

Der Befehl in diesem Fall die VM auswirkt. Das Click-Ereignis ändert nur den Fensterstatus.

Verwandte Themen