【发布时间】:2020-06-02 20:29:57
【问题描述】:
我正在使用 C#、WPF 和 .NETcore3.1 来设计 GUI。这是我第一次使用 C#,所以我的项目结构可能看起来不寻常或不理想。虽然欢迎提出使代码对 C# 更友好的建议(因为我希望有一些“使用 MVVM”的答案),但这不是我在这里的主要问题。
我最终得到了以下一般结构:
- 执行业务逻辑的 DLL 项目,大部分独立于 GUI
- 我想用来显示来自 DLL 的信息的 WPF 应用程序
在类方面,这看起来像
- DLL 中的一个类(就本问题而言,实际上是一组类)包含实际的业务逻辑,并且出于所有实际目的,您可以假设将异步更改。让我们称之为 BusinessLogicClass
- GUI 项目中的一个类,它创建各种表示层,本质上将 BusinessLogicClass 的相关属性重塑为可以使用绑定从 XAML 直接使用的格式。我们称之为 PresentationLayerClass。请注意,这是作为用户控件实现的。
- XAML GUI 本身。具体来说,自定义控件的 XAML GUI。
一些伪代码:
// In the DLL
class BusinessLogicClass:
public Boolean status{ get; set; }
// In the GUI
Using DLLNamespace;
public partial class PresentationLayerClass : UserControl
private BusinessLogicClass actual;
public PresentationLayerClass(BusinessLogicClass actual){
InitializeComponent();
this.DataContext = this;
this.actual = actual;
}
public string ConnectionStatus{
get{
if (this.actual.status == true) return "LanConnect";
else return "LanDisconnect";
}
}
public string StatusColor{
get {
if (this.actual.status == true) return "Green";
else return "Red";
}
}
// In the XAML
<iconPacks:PackIconMaterial Kind="{Binding ConnectionStatus}" Margin="5" Foreground="{Binding StatusColor}"/>
现在,我知道(虽然还没有弄清楚如何测试它)当 PresentationLayerClass 的属性发生变化时,GUI 将“更新自身”。
我想要的是,对 BusinessLogicClass 的状态属性的异步更改会沿链向上传播到 GUI。
如果有必要,为了简单起见,因为我还没有足够的知识来解释更多,假设一切都在同一个线程上,并且异步更改是由用户在 GUI 本身上触发的。说一个按钮。但是,按钮和此显示器彼此不知道也不一定不知道彼此的任何信息。信息必须通过 DLL,并且 DLL 必须触发对更新的更改。
此外,DLL 不应该被硬编码到 GUI - 我希望能够单独运行 DLL,或者使用 CLI 应用程序或其他 GUI。
我希望 INotifyPropertyChanged 的某种组合能够完成这项工作,但我似乎无法弄清楚我将如何设置它。 INotifyPropertyChanged 似乎总是在 GUI 和绑定的上下文中讨论。
我知道 MVVM 应该有助于简化这类事情。虽然我有理由想在这种特殊情况下避免使用 MVVM,但我承认我还没有完全相信 MVVM 通常值得麻烦。我非常反对流行的 MVVM 库建立的明显隐式链接。我无意开始对 MVVM 进行哲学讨论,但任何希望驳斥我这个概念的人都可以把他们的情况搁置一旁——只要你明白 MVVM 不是我在这里提出的问题的主题。
【问题讨论】:
标签: c# wpf inotifypropertychanged