【问题标题】:Closing Child Window from ViewModel从 ViewModel 关闭子窗口
【发布时间】:2017-09-03 18:50:03
【问题描述】:

我在 ViewModel 中有取消命令。

它绑定到子视图中的通道按钮。

当我按下取消按钮时,它将清除 viewModel 中所有未保存的数据。

此外,我必须关闭子窗口的当前实例。-这是我卡住的地方。

我正在使用 MVVM。

【问题讨论】:

  • 请发布一些代码。至少,您的 ViewModel 和 View 代码。查看stackoverflow.com/help/mcve 以帮助编写好问题。
  • 你是怎么打开这个窗口的?
  • 我在主窗口中有一个按钮,点击它就会显示视图

标签: wpf mvvm


【解决方案1】:

我使用以下模式。

我的 ViewModel 有一个基类

public abstract class ClosableViewModel : IClosableViewModel
{
    public event EventHandler Close;

    protected virtual void CloseView()
    {
        var handler = Close;
        if (handler != null) handler(this, EventArgs.Empty);
    }
}

实现了这个接口

public interface IClosableViewModel
{
    event EventHandler Close;
}

我想通过 ViewModel 显示和关闭我的视图的窗口基类

public class ClosableWindow : Window
{
    public ClosableWindow(IClosableViewModel viewModel)
    {
        DataContext = viewModel;
        viewModel.Close += (s, e) => Close();
    }
}

您的 ViewModel 是您要显示为对话框的视图中的 DataContext,它必须从 ClosableViewModel 继承,并且您的对话框必须从 ClosableWindow 继承。当您想从 ViewModel 中关闭您的视图时,您只需调用 CloseView 方法。

【讨论】:

    【解决方案2】:

    使用事件的另一种方法是在视图上附加一个属性。属性更改处理程序将找到视图的父窗口,并在识别到特定值后立即关闭它。

    using System.Windows;
    
    namespace WpfApp1
    {
        public class CloseSignal
        {
            public static readonly DependencyProperty SignalProperty =
                DependencyProperty.RegisterAttached("Signal", typeof(bool), typeof(CloseSignal),
                    new PropertyMetadata(OnSignalChanged));
    
            public static bool GetSignal(DependencyObject dp)
            {
                return (bool)dp.GetValue(SignalProperty);
            }
    
            public static void SetSignal(DependencyObject dp, bool value)
            {
                dp.SetValue(SignalProperty, value);
            }
    
            private static void OnSignalChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e)
            {
                if (!(bool)e.NewValue)
                    return;
                Window parent = Window.GetWindow(dp);
                if (parent != null)
                    parent.Close();
            }
        }
    }
    

    视图的 XAML 看起来像...

    <Window x:Class="WpfApp1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApp1"
            Title="MainWindow" Height="350" Width="525"
            local:CloseSignal.Signal="{Binding Signal}">
        ...
    </Window>
    

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 1970-01-01
      • 2020-10-17
      • 2012-02-06
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2017-02-08
      相关资源
      最近更新 更多