0

我有一个 WPF 窗口,使用 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 上没有任何代码。

4

3 回答 3

0

ViewModel 不应具​​有窗口引用,并且命令不应在其参数中发送它。如果您只想关闭窗口,您可以在后面的代码中执行此操作,或者如果您仍想在命令中执行此操作,那么您可以Application.Current.Windows在命令处理程序中找到您的窗口引用并关闭它。

于 2013-10-02T16:09:59.410 回答
0

尽管我同意这些人所说的在 MVVM 中使用背后的代码是可以的,但我有一个可能的解决方案给你。

首先,声明Name您的Window. 然后你可以从任何地方访问窗口,如下所示:

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

我也同意视图模型不是执行此操作的地方,而是您的代码。:)

于 2013-10-02T16:25:50.040 回答
0
<Button Command="{Binding _ICommandExit}" 
       CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"/>
于 2013-10-02T18:50:22.653 回答