ho legato il "WindowState" proprietà della mia finestra principale per il mio ViewModel al fine di modificare lo stato della finestra da un comando, ma la prima volta che minimizzare il finestra minimizza come fa un foglio di lavoro in un file Excel. C'è un modo per aggirare questo o un modo corretto per legare la proprietà "WindowState" al mio ViewModel in modo che la finestra si minimizzi correttamente?Binding il "WindowState" proprietà di una finestra in WPF utilizzando MVVM
risposta
Non credo che si dovrebbe preoccuparsi dello stato finestra in un modello di vista, è completamente sbagliato perché uno strato di livello inferiore è a conoscenza di un più alto livello di livello (quindi sbagliato Separation of Concerns (SOC)).
Cosa faccio di solito in questo caso è iscriviti ai cambiamenti del modello di vista dal code-behind del controllo o della finestra (in tal modo la vista) contenente il modello di vista. In questo caso, è valido per scrivere codice nel code-behind, perché viene utilizzato solo nella vista (e quindi il code-behind è il luogo perfetto per questa logica, che in realtà non si vuole test di unità).
Mentre questo è vero in generale, è anche possibile per il modello al fine di esporre una proprietà estranei a 'WindowState' che dovrebbe dettare il suo valore. Ad esempio, uno dei miei modelli di visualizzazione conteneva il 'Boolean ShowResults'. Volevo che questo passasse il mio 'WindowState' a' Maximize', quindi ho creato un oggetto BoolToWindowStateConverter. – Pakman
questo è un lavoro del campione intorno a quello provato con Relaying Command Logic. Otterrete maggiori dettagli su 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>
e nel Windows ViewModel
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");
}
}
}
Un'altra opzione da considerare è la sottoscrizione sia tramite un comando e un evento al codice dietro, per esempio:
<Button Command="{Binding SnoozeCommand}" Click="Button_Click">Snooze</Button>
Il comando in questo caso colpisce la VM. L'evento Click, cambia solo lo stato della finestra.
- 1. WPF Trigger binding alla proprietà MVVM
- 2. Proprietà WPF ReadOnly dependance utilizzando MVVM
- 3. Cambia immagine utilizzando il trigger WPF MVVM
- 4. Comando di binding in WPF con MVVM
- 5. WPF e MVVM. Binding Eventi
- 6. WPF MVVM Modifica Proprietà Animazione
- 7. DateTimePicker wpf toolkit binding
- 8. Sfondo cella WPF DataGrid utilizzando il binding
- 9. come chiamare l'evento Loaded di una finestra in MVVM WPF?
- 10. Apertura di una nuova finestra in MVVM WPF
- 11. WPF utilizzando MVVM: DataBinding con RelativeSource
- 12. Converti proprietà automatica in proprietà di notifica (MVVM in WPF)
- 13. WPF: binding, setter proprietà condizionale
- 14. WPF Associazione proprietà Binding in HierarchicalDataTemplate
- 15. MVVM Command Binding
- 16. MVVM + WPF + Popup = clueless
- 17. La finestra di errore mostra modal in MVVM WPF
- 18. MVVM datagrid binding
- 19. WPF Expander IsExpanded binding
- 20. Database WPF Image.Source in MVVM
- 21. Aprire una nuova finestra in MVVM
- 22. Rimuovere il binding in WPF utilizzando il codice
- 23. Annulla in binding WPF
- 24. Quando utilizzare Path in WPF Binding?
- 25. wpf textbox text binding
- 26. Come implementare una barra di avanzamento utilizzando il pattern MVVM
- 27. MVVM + UserControl + proprietà di dipendenza
- 28. WPF MVVM Binding Checkbox.IsChecked a un oggetto denominato in un dizionario <string, bool>
- 29. Wpf UserControl e MVVM
- 30. WPF (MVVM): chiusura di una vista da Viewmodel?
Cos'hai finora? Pubblica un po 'di codice. – decyclone
Senza conoscere lo sfondo di ciò che stai cercando di fare, sembra che tu possa portare la cosa ViewModel ad un passo troppo lontano. Le cose che sono strettamente logiche dell'interfaccia utente sono completamente accettabili in code-behind e di fatto non hanno alcun business nel ViewModel. Direi che questo include cose come lo stato della messa a fuoco e della finestra. – Josh
@Josh Enstein Passo a usare il codice come hai detto tu, ora funziona perfettamente. Quello che sto cercando di fare è nascondere il pulsante della barra delle applicazioni quando la finestra è ridotta a icona e utilizzare una voce di menu collegata all'icona della barra delle applicazioni per riportare la finestra. – norlando