2013-10-02 94 views
0

我有一個WPF窗口的datacontext被實例化全光照XAML關閉窗口XAML從視圖模型

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModels="clr-namespace:Contratos.ViewModels" x:Class="Contratos.Views.TipoAsociadoAcopio" 
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
    xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF45" 
    xmlns:l="clr-namespace:Recursos;assembly=Recursos" 
    xmlns:controls="clr-namespace:Recursos.Controls;assembly=Recursos" 
    xmlns:resources="clr-namespace:ModelSeguridad.Resources;assembly=ModelSeguridad" 
    Title="{x:Static resources:Labels.CONTRATO_TipoContratoAcopio}" Height="Auto" Width="Auto"> 
<Window.Resources> 
    <CollectionViewSource x:Key="ListaItems" Source="{Binding ListaItems}"/> 
    <ViewModels:TipoAsociadoVM x:Key="ViewDataContext"/>  
</Window.Resources> 
<Grid> 
    <StackPanel> 
     <Button Command="{Binding _ICommandExit}" CommandParameter="{W H A T H E R E}" /> 
    </StackPanel> 
</Grid> 

我需要的時候上的退出按鈕,用戶點擊,我的問題是如何關閉這個窗口如果使用XAML實例化,我可以將窗口引用發送給viewmodel嗎?

我想維護MVVM模式,那是因爲我沒有任何代碼在mi codebehind上。

+1

就我個人而言,我認爲在後面的代碼中放置按鈕點擊處理程序是完全可以接受的,而不是綁定到命令。關閉窗口純粹是一個UI任務,所以你仍然保持視圖邏輯解耦。 – zmb

+0

@zmb Tks,是的,你有理由。但是我喜歡爲我的所有Windows自動執行此任務,並且在用戶關閉窗口時必須記錄一些日誌。 –

+0

這不是MVVM。只需關閉用戶界面中的窗口即可。 – Will

回答

0

ViewModel不應該有窗口引用,並且命令不應該在其params中發送它。如果你只是想關閉你的窗口,你可以在後面的代碼中執行它,或者如果你仍然想要在命令中執行它,那麼你可以在命令處理程序中找到你的窗口引用Application.Current.Windows並關閉它。

0

雖然我同意這些傢伙們說可以在MVVM中使用代碼,但我有一個可能的解決方案。

首先,申報您的WindowName財產。然後,你可以從任何地方像這樣訪問該窗口:

Window window = Application.Current.Windows.OfType<Window>().Where(w => w.Name == 
"WindowName").FirstOrDefault(); 
if (window != null) window.Close(); 

我也同意,視圖模型是做到這一點的地方,但它是你的代碼。 :)

+0

Tks for your hel,但是如果你有更多的同一類型的窗口, –

+0

給他們不同的名字,並確保你保存他們的記錄。當你想關閉時,只需在我的示例代碼中用'WindowName'替換相關'Window'的名稱,它就會找到並關閉'Window'。 – Sheridan

0
<Button Command="{Binding _ICommandExit}" 
     CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"/>