gpt4 book ai didi

c# - WPF中MVVM下的父 subview 通信

转载 作者:行者123 更新时间:2023-12-03 10:27:53 25 4
gpt4 key购买 nike

我已经为这个问题苦苦挣扎了一段时间了。我正在构建我的第一个WPF MVVM应用程序。在这个应用程序中,我有一个AppView(及其相应的viewmodel)。 subview 包含在选项卡中,并由单独的 View (UserControl)表示,并且每个 View 都有一个viewmodel。到目前为止,一切都很好。

在一个 View 中,有一个客户列表和一个删除按钮。我在viewmodel上也有一个对应的命令,实际上是删除了记录,这个工作很好。现在,我希望删除按钮创建一个具有两个按钮的新 View ,一个用于确认,另一个用于取消,然后如果用户单击“确认”按钮,则执行删除。

这里的问题是每个 View 及其对应的 View 模型都相互隔离(据我所知),因此我无法访问第二个 View View 模型以查看是否单击了确认按钮。

到目前为止,我发现的唯一可行的解​​决方案是在一个 View 上添加一个事件,然后将另一个 View 订阅到该事件。但是,这项技术对于如此琐碎的任务而言相当复杂。还有其他选择吗?两个 View 不能共享相同的数据上下文或 View 模型吗?

谢谢!

最佳答案

var dialog = new DialogViewModel();// could be a DialogService if you wish
再次在此DialogViewModel或DialogService中选择实际操作的方式。

对话框。结果在这种情况下将返回您的确认为true或false
var settings = new Dictionary<string, object>();
settings["Owner"] = this;
settings["WindowStartupLocation"] = WindowStartupLocation.CenterParent;
windowManager.ShowDialog(dialog, null, settings);
if(dialog.Result == true)
do the delete on the parent viewmodel.

或者,您可以使用IEventAggregator和消息包来完成所有操作。我个人将第一个用于很多事情。有时视情况而定。

大多数人会偏爱用于SoC的IDialogService事物方法,并对其进行DI处理,以使用它将其引入 View 模型。然后,每个 View 模型将负责其自己的对话框。从那里,您可以调用ShowDialog,因为它是WindowManager的一部分,您可以单击"is"或“否”,也可以为dialogview设置任何设置。有很多方法可以给猫皮剥皮,但是最后您需要KISS方法学,并且还需要一种不会破坏您尝试遵循的模式的方法。. hell 的一切都可以将其添加到所有 View 模型的viewmodelbase基类中继承以全局访问。无论如何,所有功能都希望您的应用最终表现出来。

- 更新 -

public class YourViewModel(IWindowManager winMan)
{
private readonly IWindowManager _winMan;
public YourViewModel()
{
_winMan = winMan;
}

public void DeleteCustomer()
{
var dialog= new DialogViewModel(); // not best way but...
var settings = new Dictionary<string, object>();
settings["Owner"] = this; //<< Parent
settings["StartupLocation"] = WindowStartupLocation.CenterParent;
_winMan.ShowDialog(dialog, null, settings);

if(dialog.Result)
//do delete
else
//do nothing
}
}

关于c# - WPF中MVVM下的父 subview 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com