如何在 mvvm 中关闭视图模型中的视图?



我使用带有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

相关内容

  • 没有找到相关文章

最新更新