我使用带有MVVM模式的WPF。我想从视图模型关闭一个窗口。我尝试使用以前一些问题的解决方案,但它不起作用。
这是我的代码:
视图模型:
//Defining commands
public RelayCommand SaveAddBankCommand { get; private set; }
//Constructor
public AddBankVM()
{
//Initializing Commands
SaveAddBankCommand = new RelayCommand(SaveAddBank);
}
//Commands methods
public void SaveAddBank(object parameter)
{
new Banks().AddBank(this.BankName, _Status, System.Convert.ToDouble(Credit), this.Notes);
new Done("Bank has been added successfully.");
//here i want to close the window.
}
查看类:
public partial class AddBankView : Window
{
public AddBankView()
{
InitializeComponent();
var addBankVM = new AddBankVM();
this.DataContext = addBankVM;
}
}
好的。 这是一种方法:
在视图模型中...
//Commands methods
public void SaveAddBank()
{
new Banks().AddBank(this.BankName, _Status, System.Convert.ToDouble(Credit), this.Notes);
new Done("Bank has been added successfully.");
//here i want to close the window.
CloseWindowEvent?.Invoke(this, EventArgs.Empty);
}
public event EventHandler CloseWindowEvent;
在初始化背后的代码中...
InitializeComponent();
DataContext = new AddBankVM();
(DataContext as AddBankVM).CloseWindowEvent += CommandBench_CloseWindowEvent;
最后是代码隐藏中的事件处理程序...
private void CommandBench_CloseWindowEvent(object sender, EventArgs e)
{
Close();
}
从概念上讲,正在发生的事情是视图模型将事件发送到窗口以关闭自身。
我怀疑MVVM风格的警察会对这种方法有一些问题。 让我们看看我们是否收到他们的消息。
最简单的方法是引入接口:
public interface IClosable
{
void Close();
}
然后,您唯一需要在代码隐藏中更改的是指定窗口实现IClosable
:
public partial class MainWindow : Window, IClosable
{
public MainWindow()
{
InitializeComponent();
}
}
XAML:
<Button Width="50"
Height="20"
Command="{Binding CloseCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}}"
Content="Close" />
视图模型:
#region Commands
public DelegateCommand<IClosable> CloseCommand => new DelegateCommand<IClosable>(Close, CanClose);
private bool CanClose(IClosable parameter)
{
return true;
}
private void Close(IClosable parameter)
{
var closable = parameter as IClosable;
if (closable != null)
{
closable.Close();
}
}
或者,您可以使用事件跳跳虎、行为或附加行为,但恕我直言,它不那么简单。
在此链接中,您将找到从视图模型打开和关闭对话框的绝佳机制。 https://www.youtube.com/watch?v=OqKaV4d4PXg