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
Antwort
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).
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
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");
}
}
}
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.
- 1. Binden eines Bildes in WPF MVVM
- 2. Binden eines TextBlocks an die Eigenschaft eines Fensters
- 3. Erneutes Binden des DataContext eines Fensters in WPF
- 4. Überprüfen des Werts des Fensters "WindowState" in einem Trigger
- 5. WPF: Binden eines ContextMenu an einen MVVM-Befehl
- 6. WPF MVVM Eigenschaft Animation ändern
- 7. WPF-Triggerbindung an MVVM-Eigenschaft
- 8. WPF binden die Vordergrundfarbe eines ListViewitem
- 9. An eine Eigenschaft eines übergeordneten Elements in wpf binden
- 10. MVVM (mit WPF) - Binden mehrerer Ansichten an das gleiche ViewModel
- 11. Konvertieren der automatischen Eigenschaft in die Benachrichtigungseigenschaft (MVVM in WPF)
- 12. WPF ReadOnly-Abhängigkeitseigenschaften mit MVVM
- 13. Testen eines WPF-Fensters mit StaticResources
- 14. Bild mit Trigger ändern WPF MVVM
- 15. WPF (MVVM) Datenbindungsproblem
- 16. MVVM-Bindung mit exponierter Eigenschaft
- 17. Problem beim Binden eines Gleitkomma-Eingabefeldes in WPF
- 18. WPF-Datenbindung mit ResourceDictionary MVVM
- 19. WPF - MVVM - Textfeld nicht mehr synchron mit viewmodel -Eigenschaft
- 20. Erstellen eines gemeinsamen Fensters in WPF
- 21. Implementierung Fehler eines transparenten Fensters in WPF
- 22. Abbrechen eines Fensters schließen in WPF
- 23. Verschieben eines randlosen Fensters in WPF
- 24. Wie bekomme ich die ClientSize eines WPF-Fensters?
- 25. Wie wird die List-Eigenschaft eines Objekts in WPF bevorzugt?
- 26. WPF: Die Hintergrundfarbe eines listviewitems an eine hexadezimale String-Eigenschaft eines Objekts binden
- 27. WPF Binden an übergeordneter Eigenschaft aus verschachteltem Elemente Stil mit
- 28. WPF: Wie an eine geschachtelte Eigenschaft binden?
- 29. Wie kann ich in WPF die Breite eines Fensters animieren?
- 30. WPF - Image-Eigenschaft an Image-Steuerelement binden
Was hast du bisher? Veröffentlichen Sie einen Code. – decyclone
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
@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