【问题标题】:XAML close the window from View model [duplicate]XAML从视图模型中关闭窗口[重复]
【发布时间】:2013-10-09 02:28:00
【问题描述】:

我有一个 WPF 窗口,datacontext 使用 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 实例化的,我该如何将 Window 引用发送到 viewmodel。

我正在尝试维护 MVVM 模式,那是因为我在 mi codebehind 上没有任何代码。

【问题讨论】:

  • 就个人而言,我认为将按钮单击处理程序放在后面的代码中而不是绑定到命令是完全可以接受的。关闭窗口纯粹是一个 UI 任务,因此您仍然保持视图逻辑解耦。
  • @zmb Tks,是的,你有原因。但我喜欢为我所有的 Windows 自动执行此任务,而且当用户关闭窗口时必须捕获一些日志。
  • 那不是 MVVM。只需在 UI 中关闭窗口即可。
  • 很遗憾,那些用户决定关闭这个问题,说这是另一个帖子的重复,因为如果他们真的阅读了这两个帖子,他们都会看到他们是错误。这个问题不是关于像其他问题一样关闭MainWindow,因此显示如何关闭MainWindow 的答案回答了这个问题。

标签: c# wpf xaml mvvm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    首先,声明WindowName 属性。然后你可以从任何地方访问这个窗口,像这样:

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

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

    【讨论】:

    • 感谢您的帮助,但是如果您有多个相同类型窗口的实例怎么办?
    • 给他们起不同的名字,并确保记录下来。当您想关闭时,只需在我的示例代码中将相关Window 的名称替换为WindowName,它就会找到并关闭该Window
    【解决方案3】:
    <Button Command="{Binding _ICommandExit}" 
           CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=Window}}"/>
    

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 2012-11-17
      • 2018-06-12
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 2012-04-22
      • 2020-01-22
      • 1970-01-01
      相关资源
      最近更新 更多