我在ViewModel中有取消命令。从ViewModel关闭子窗口
这势必会在子视图烛按钮。
当我按下取消按钮会清除视图模型我所有未保存的数据。
此外,我不得不关闭子窗口的当前实例。 - 这是我卡住的地方。
我使用MVVM。
我在ViewModel中有取消命令。从ViewModel关闭子窗口
这势必会在子视图烛按钮。
当我按下取消按钮会清除视图模型我所有未保存的数据。
此外,我不得不关闭子窗口的当前实例。 - 这是我卡住的地方。
我使用MVVM。
我使用以下模式。
我有一个基类为我的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;
}
和窗口基类我查看我想告诉和关闭通过视图模型
public class ClosableWindow : Window
{
public ClosableWindow(IClosableViewModel viewModel)
{
DataContext = viewModel;
viewModel.Close += (s, e) => Close();
}
}
您的视图模型是在DataContext从您的视图要显示为d ialog必须从ClosableViewModel
继承,并且您的对话框必须从ClosableWindow
继承。当你想从ViewModel关闭视图时,只需调用CloseView
方法即可。
到使用事件的替代方案是一个附加的属性,那张图。属性更改处理程序将查找视图的父窗口,并在识别出特定值后立即关闭它。
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>
张贴一些代码,请。至少,您的ViewModel和View代码。查看https://stackoverflow.com/help/mcve寻求帮助,撰写出色的问题。 –
你是怎么打开这个窗口的? – Emad
我在主窗口中有一个按钮,点击它显示出来 –