【问题标题】:How to Bind to window's close button the X-button如何绑定到窗口的关闭按钮 X 按钮
【发布时间】:2013-05-15 20:01:32
【问题描述】:

如何将控件上的一个按钮绑定到关闭窗口的 X 按钮? 我只想创建只是关闭窗口的取消按钮。 我在我的代码中使用 MVVM。 如果可能只在 xaml 中执行,我只是没有任何特殊代码与按钮单击。

【问题讨论】:

    标签: c# wpf xaml mvvm


    【解决方案1】:

    您可以调用Close() 方法,该方法将关闭窗口。

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

    【讨论】:

    • 不要害怕将代码放在 MVVM 应用程序的代码隐藏中。 如果您正在实现的逻辑是视图独有的(在这种情况下,是的,因为你正在关闭窗口),那么它属于代码隐藏,而不是视图模型。
    【解决方案2】:

    如果它是 WPF(如果我没记错的话),您可以使用父级的 CallMethodAction 作为行为,并仅通过 XAML 使用 Close() 方法。类似的东西;

    父窗口x:Name="window"

    命名空间;

     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>
    

    希望这会有所帮助。

    【讨论】:

    • 别忘了您需要在项目中引用适当的混合库才能使用它
    • 该死的我去回答它只通过 xaml 的 OP 规范,甚至不能得到一个赞成哈哈浪费的努力。
    • +1 但我不会命名我的窗口...我会改用这个绑定。 TargetObject="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
    • 另一个好点,我只是在抱怨,但感谢小伙子的:P
    【解决方案3】:

    没有代码隐藏的 MVVM 解决方案也可能如下所示:

    查看:

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

    视图模型:

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

    但是 SystemCommands 来自 ,所以如果您使用旧版本的 ,您也可以使用以下功能。

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

    【讨论】:

    • 技术上打破了 MVVM 模式,因为 ViewModel 不应该有任何对视图程序集的引用(例如 System.Windows.*)。
    • @SpikeX 我不想争论,我知道在这种情况下它不是最好的解决方案,甚至没有必要在 VM 中这样做,但我不会说 MVVM 就是这样严格的。你不在你的虚拟机中使用 System.Windows.Threading 吗?还是 Application.Dispatcher?
    • 不。绑定是线程安全的,并且可以发生在不是 UI 线程的线程上,因此不需要调度程序。如果您需要使用调度程序,您可以向视图发送解耦消息,视图会处理它。
    • @SpikeX 没那么快 xD ICommand 来自 System.Windows.Input 命名空间……你不在你的虚拟机中使用它吗?是的,我知道这是不同的组装。这不是我的意思。在我看来,MVVM 不仅仅是关于应该在哪里使用什么......它是关于它带给你的东西。例如,我记得两年前他们嘲笑 Prism 家伙使用代码隐藏。我也从未使用过代码隐藏。从来不需要它。我宁愿使用行为来使其可重用。但是仍然......我在上面的代码中失去了 MVVM 的什么优势?
    • 在哪里写我不能在VM中使用Window类?我希望它不是在某个地方。我可以完成我的虚拟机,而无需关心 View 的外观。另外,我可以在关闭窗口之前轻松地做其他事情。我没有理由想到为什么我不能在 VM 中使用 Window 对象。
    猜你喜欢
    • 2019-09-17
    • 2014-07-16
    • 2021-12-09
    • 1970-01-01
    • 2011-03-18
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多