2013-05-15 16 views

risposta

7

È possibile chiamare semplicemente il metodo Close(), che chiuderà la finestra.

private void MyButton_Click(object s, RoutedEventArgs e) 
{ 
    Close(); 
} 
+0

Sto utilizzando MVVM. –

+12

** Non abbiate paura di inserire codice nel codebehind di un'applicazione MVVM. ** Se la logica che state implementando è esclusiva per la vista (in questo caso, sì, perché state chiudendo la finestra), allora appartiene al codebehind, non al viewmodel. – qJake

3

Se si tratta di WPF (e purché non ricordo male) si può semplicemente utilizzare CallMethodAction dal genitore come un comportamento e utilizzare metodo Close() tramite appena XAML. Qualcosa di simile a;

Parent Window x:Name="window"

spazi dei nomi;

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

-

<Button Content="Cancel"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
     <ei:CallMethodAction 
      TargetObject="{Binding ElementName=window}" 
      MethodName="Close"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    </Button> 

Spero che questo aiuti.

+3

Non dimenticare che è necessario fare riferimento alle appropriate librerie di blend nel progetto per utilizzare questo –

+0

Touché @BobVale ▲ 1 :) –

+0

Beh dannazione vado a rispondere andando solo con le specifiche OP di xaml e non riesco nemmeno a ottenere un upvote haha ​​sprecato sforzo. –

3

MVVM soluzione senza code-behind potrebbe anche apparire come questo:

Vista:

<Button Content="Cancel" Command="{Binding CloseWindowCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 

ViewModel:

public ICommand CloseWindowCommand 
{ 
    get 
    { 
     return new RelayCommand<Window>(SystemCommands.CloseWindow); 
    } 
} 

Ma SystemCommands è da quindi se rock in alcune versioni precedenti di puoi anche tu se seguente.

public ICommand CloseWindowCommand 
{ 
    get 
    { 
     return new RelayCommand<Window>((window) => window.Close()); 
    } 
} 
+0

Questo * tecnicamente * rompe il pattern MVVM dal ViewModel non dovrebbe avere alcun riferimento per visualizzare gli assembly (come System.Windows. *). – qJake

+0

@SpikeX Non voglio discutere e so che in questo caso non è la soluzione migliore e non è nemmeno necessario farlo in VM, ma non direi che MVVM è rigoroso. Non usi System.Windows.Threading nelle tue macchine virtuali? O Application.Dispatcher? –

+0

No. Binding è thread-safe e può succedere su un thread che non è il thread dell'interfaccia utente, quindi non è necessario il dispatcher. Se è necessario utilizzare il dispatcher, si invierà un messaggio disaccoppiato alla vista e la vista si prenderà cura di esso. – qJake

0

Installare Microsoft.Expression.Interactions da nugget e utilizzare la risposta data da Chris W. in alto.

+1

"usa la risposta data da Chris W. sopra" non è una risposta, specialmente se quella risposta scompare o non è più "sopra". Fornire una risposta completa o semplicemente commentare sotto la risposta specifica esistente. –

Problemi correlati