# 开发规范 ## 一、总体架构与设计原则 ### (一)MVVM 架构概述 在软件开发中,为实现良好代码结构、可维护性与可扩展性,应分离视图逻辑与业务逻辑,MVVM 设计模式是有效的解决方案。 View(视图层):包含用户界面控件与 XAML 元素,是用户与应用交互界面,负责展示数据和接收用户操作。应保持简洁,避免复杂业务逻辑,依据 ViewModel 数据展示,并将用户操作传递给 ViewModel 处理。 ViewModel(视图模型层):是视图层和模型层的桥梁,处理控件数据绑定,将视图层控件属性与自身属性绑定实现数据双向流动,还处理视图交互逻辑,调用模型层方法完成业务功能并反馈结果给视图层。 Model(模型层):处理数据和业务逻辑,包括数据获取、存储、处理和验证。对于复杂数据关系,可借助 ORM 技术或自定义数据结构;简单数据存储用普通类和属性。模型层独立于视图层和视图模型层,保证可复用性。 通过将控件属性绑定到 ViewModel,再由 ViewModel 与 Model 交互,实现数据和逻辑在各层有效流转,提高应用可维护性和扩展性。 ## 二、具体实现细节 ### (一)ViewModel #### 1. 命令定义与实现 ##### (1)命名规范 ViewModel 中的命令应采用 “动词 + 名词 + Command” 格式命名,清晰表明功能。对应的执行方法命名与命令中的动词一致,便于理解命令与执行逻辑的关联。 ##### (2)代码位置 与视图交互的命令在对应的 ViewModel 类中定义和实现,ViewModel 类放在 “ViewModels” 文件夹下。大型项目中,按功能模块细分该文件夹,如 3D 模型相关的 ViewModel 放在 “ViewModels/3DModelViewModels” 文件夹。 ##### (3)实现方式 使用合适的命令类实现:建议用实现 ICommand 接口的命令类,如自定义的 “RelayCommand”。它要处理执行逻辑和可执行状态判断,依据条件(如数据准备情况、用户权限)决定命令是否可执行。 命令初始化与方法绑定:在 ViewModel 构造函数中初始化命令并与执行方法绑定,如 “LoadModelCommand = new RelayCommand (LoadModel);”,确保命令触发时调用正确执行方法。 参数处理:命令执行需传递参数时,命令类要能正确处理参数传递和接收。修改命令类构造函数或执行方法以接受参数,在视图层绑定命令时设置参数值。 #### 2. 数据绑定属性 ##### (1)命名规范 数据绑定属性名称用驼峰命名法,清晰反映绑定的数据内容,如 “DisplayName” 绑定文本框显示文本,“DataList” 绑定列表数据。 ##### (2)数据类型选择 根据绑定控件需求和数据性质选择合适数据类型。简单文本显示控件用 “string” 类型;列表控件用 “ObservableCollection” 等集合类型,实现数据更新自动刷新。 ##### (3)通知机制 数据绑定属性值变化时,用合适机制通知视图更新。在支持数据绑定的框架(如 WPF)中,可利用相关接口(如 WPF 的 “INotifyPropertyChanged” 接口)。示例如下: ```csharp private string _displayName; public string DisplayName { get { return _displayName; } set { _displayName = value; OnPropertyChanged(nameof(DisplayName)); } } ``` 属性 “set” 方法调用时,通过 “OnPropertyChanged” 方法通知视图层属性值变化,促使控件更新显示内容。 #### 3. 事件处理与通知 ##### (1)事件命名 ViewModel 中通知视图的事件命名采用 “名词 + 过去分词” 形式,表明动作完成或状态改变,如 “ModelLoaded” 表示模型加载完成,便于理解事件含义和业务逻辑状态。 ##### (2)事件参数类型 事件参数类型准确反映事件携带的信息。如 “ModelLoaded” 事件传递加载后的模型对象,参数类型为 “Model3D”。若事件需传递多个信息,创建自定义事件参数类封装信息。 ##### (3)事件触发 业务逻辑完成后(如模型加载成功、数据保存完成),在合适位置触发事件,用标准事件触发机制,如 “ModelLoaded?.Invoke (model);”。触发前确保事件初始化和订阅正确,避免空引用等问题。 ### (二)View #### 1. XAML 结构与布局 ##### (1)命名空间引用 XAML 文件开头只引入实际使用的命名空间,按字母顺序排序,减少复杂性、提高编译速度,如: .xaml ```csharp ``` ##### (2)布局设计原则 选择合适的布局容器:优先用合适布局容器实现灵活可维护布局。简单水平或垂直排列控件用 “StackPanel”,通过 “Orientation” 属性控制排列方向。需精确行列布局用 “Grid”,通过定义行和列定位控件。 避免绝对坐标定位:尽量不用绝对坐标定位控件,以免界面在不同分辨率和窗口大小下适应性差。使用布局容器可实现自适应,保证良好显示效果。 ##### (3)控件命名 为重要控件命名,采用驼峰命名法且以控件类型开头,如 “btnLoadModel”(加载模型按钮)、“txtInputFileName”(输入文件名文本框),提高代码可读性。复杂界面可分组控件并命名,方便在代码 - behind 中访问和操作,如 “LoginControls” 包含登录相关控件。 #### 2. 数据绑定与命令绑定 ##### (1)绑定表达式规范 数据绑定表达式:数据绑定用 “{Binding Path=PropertyName}” 格式,“Path” 可省略(绑定当前数据上下文直接属性时)。绑定深层属性需指定 “Path” 值,如: .xaml ```csharp ``` 命令绑定表达式:命令绑定用 “{Binding CommandName}” 格式,确保命令在 ViewModel 数据上下文中存在,如: .xaml ```csharp