【问题标题】:View models shared between WPF and Blazor in a .NET Standard project查看 .NET Standard 项目中 WPF 和 Blazor 之间共享的模型
【发布时间】:2021-04-20 13:14:50
【问题描述】:
是否可以在 .NET Standard 项目中保留视图模型?
我想为两种不同的应用程序提供一个通用视图模型:一种是用 WPF 编写的,另一种是用 Blazor 编写的。
当我想在一个单独的线程中调用我的 ICommand 的事件 CanExecuteChanged?.Invoke(this, EventArgs.Empty); 并得到一个错误时,问题出现了:“System.InvalidOperationException:调用线程无法访问此对象,因为不同的线程拥有它。”。我在 .NET Standard 中看不到 Dispatcher 支持,也看不到它的任何替代方案。这样的视图模型能否在不同平台(例如 Windows、Mac 和 Linux)之间共享?
【问题讨论】:
标签:
c#
wpf
mvvm
blazor
.net-standard
【解决方案1】:
好主意。假设 SPA,我尝试实现它的方式是注册一个具有依赖注入的类,该类将代表 ICommand。
示例代码来自一个类,该类从我在网络上找到的一个小建议发展为很多功能。
我刚刚剪掉了几段代码,如果您想尝试这种方式并且需要更多信息,请告诉我,我会给出完整的代码答案。
然后按钮上的@onclick 方法可以调用在注入的类中引发事件的方法。
订阅类可以在同一个组件或其他任何地方。
此外,如果您的 WPF 不是开发人员展示他们对 WPF 的理解程度的其中之一,那么您应该能够编写一个脚本来实现这种转换的自动化。
在旁注中,我肯定看到 Blazor Serverside 与 WPF 的相似之处。对我来说,就好像 WPF 得到了长期的更新,并且几乎在每个领域都得到了改进。我也把它当作 WPF 来处理,但我不尝试直接转换,因为它已经改进了。
public void ShowNotification(NotificationMessage notificationMessage)
{
Message = notificationMessage;
NotifyMessageArrived();
}
private void NotifyMessageArrived()
{
OnRaiseMessageArrivedNotification?.Invoke();
}
public event Action OnRaiseMessageArrivedNotification;