基于ArcGIS Pro SDK的MVVM架构

示例结果展示

文件夹创建

相对于原始C#,少了Command文件夹里的类。该文件中的RelayCommand使用 ArcGIS.Desktop.Framework

Properties属性配置,主要用于设置执行程序路径(自带文件夹)

DarkImages用于存放深色图片(自带文件夹)

Images用于存放浅色图片(自带文件夹)

DataHelper存放测试数据,或者是从数据库读取到数据

Model用于存放类数据Student类等

View存放前端界面

ViewModel存放View和Model之间处理的事件及方法,属性。

代码

DataHelper

StudentDataHelper

using ProAppModuleMVVM.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ProAppModuleMVVM.DataHelper
{internal class StudentDataHelper{public static ObservableCollection<Student> GetStudent(){ObservableCollection<Student> sampleStudent = new ObservableCollection<Student>();sampleStudent.Add(new Student() { Id = 0, TeacherId = 0, Name = "学生0", Age = 33 });sampleStudent.Add(new Student() { Id = 1, TeacherId = 0, Name = "学生1", Age = 22 });sampleStudent.Add(new Student() { Id = 2, TeacherId = 1, Name = "学生2", Age = 35 });sampleStudent.Add(new Student() { Id = 3, TeacherId = 0, Name = "学生3", Age = 27 });return sampleStudent;}}
}

TeacherDataHelper

using ArcGIS.Core.Data.UtilityNetwork.Trace;
using ProAppModuleMVVM.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ProAppModuleMVVM.DataHelper
{internal class TeacherDataHelper{public static ObservableCollection<Teacher> GetTeacher(){ObservableCollection<Teacher> sampleTeacher = new ObservableCollection<Teacher>();sampleTeacher.Add(new Teacher() { Id = 0, Name = "老师0", Age = 33 });sampleTeacher.Add(new Teacher() { Id = 1, Name = "老师1", Age = 22 });sampleTeacher.Add(new Teacher() { Id = 2, Name = "老师2", Age = 35 });sampleTeacher.Add(new Teacher() { Id = 3, Name = "老师3", Age = 27 });return sampleTeacher;}}
}

Model

Student

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ProAppModuleMVVM.Model
{internal class Student{public long Id { get; set; }public long TeacherId { get; set; }public string Name { get; set; }public int Age { get; set; }}
}

Teacher

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ProAppModuleMVVM.Model
{internal class Teacher{public long Id { get; set; }public string Name { get; set; }public int Age { get; set; }public List<Student> Students { get; set; }}
}

View

文件夹分布

右键添加-》新建项目

ProWindow1.xaml

<controls:ProWindow x:Class="ProAppModuleMVVM.View.ProWindow1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:controls="clr-namespace:ArcGIS.Desktop.Framework.Controls;assembly=ArcGIS.Desktop.Framework"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:extensions="clr-namespace:ArcGIS.Desktop.Extensions;assembly=ArcGIS.Desktop.Extensions"xmlns:viewmodel="clr-namespace:ProAppModuleMVVM.ViewModel"xmlns:model="clr-namespace:ProAppModuleMVVM.Model"mc:Ignorable="d"Title="ProWindow1" Height="300" Width="300"WindowStartupLocation="CenterOwner"><controls:ProWindow.DataContext><viewmodel:ProWindow1ViewModel /></controls:ProWindow.DataContext><controls:ProWindow.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><extensions:DesignOnlyResourceDictionary Source="pack://application:,,,/ArcGIS.Desktop.Framework;component\Themes\Default.xaml"/></ResourceDictionary.MergedDictionaries></ResourceDictionary></controls:ProWindow.Resources><Grid><TreeViewBorderThickness="0"ItemsSource="{Binding ResultList, Mode=TwoWay}"VirtualizingPanel.IsVirtualizing="True"><TreeView.Resources><DataTemplate DataType="{x:Type model:Student}"><StackPanel Orientation="Horizontal" Margin="2"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="auto"/><ColumnDefinition Width="auto"/></Grid.ColumnDefinitions><TextBlock Grid.Column="0" Text="{Binding Name, StringFormat=学生姓名:\{0\}}" Margin="5,1" /><TextBlock Grid.Column="1" Text="{Binding Age, StringFormat=学生年龄:\{0\}}" Margin="5,1" /></Grid></StackPanel></DataTemplate><HierarchicalDataTemplate DataType="{x:Type model:Teacher}" ItemsSource="{Binding Students, Mode=OneWay}"><StackPanelMargin="2"Orientation="Horizontal"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="auto" /><ColumnDefinition Width="auto" /></Grid.ColumnDefinitions><TextBlockGrid.Column="0"Margin="5,1"Text="{Binding Name, StringFormat=老师姓名:\{0\}}" /><TextBlockGrid.Column="1"Margin="10,0"Text="{Binding Age, StringFormat=老师年龄:\{0\}}" /></Grid></StackPanel></HierarchicalDataTemplate></TreeView.Resources></TreeView><Button Content="删除老师0" Grid.Row="1" Height="20" Command="{Binding DeleteCommand}" Style="{DynamicResource Esri_SimpleButton}"></Button></Grid>
</controls:ProWindow>

ShowProWindow1.cs该类是自动生成的,主要用于显示窗口,配合Config.daml使用

ViewModel

ProWindow1ViewModel

using ArcGIS.Desktop.Framework;
using ProAppModuleMVVM.DataHelper;
using ProAppModuleMVVM.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;namespace ProAppModuleMVVM.ViewModel
{internal class ProWindow1ViewModel : INotifyPropertyChanged{#region Fieldsprivate string _searchText;private ObservableCollection<Teacher> _resultList;#endregion #region Propertiespublic ObservableCollection<Student> StudentList { get; private set; }public ObservableCollection<Teacher> TeacherList { get; private set; }// 查询关键字public string SearchText{get { return _searchText; }set{_searchText = value;RaisePropertyChanged("SearchText");}}// 查询结果public ObservableCollection<Teacher> ResultList{get { return _resultList; }set{_resultList = value;RaisePropertyChanged("ResultList");}}public ICommand DeleteCommand{get { return new RelayCommand(Deleting, CanDeleting); }}#endregion #region Constructionpublic ProWindow1ViewModel(){StudentList = StudentDataHelper.GetStudent();TeacherList = TeacherDataHelper.GetTeacher();foreach (Teacher teacher in TeacherList){teacher.Students = new List<Student>();foreach (Student student in StudentList){if (student.TeacherId == teacher.Id){teacher.Students.Add(student);}}}_resultList = TeacherList;}#endregion#region Command Handlerpublic void Deleting(){foreach (Teacher teacher in ResultList.ToList()){if (teacher.Id == 0){ResultList.Remove(teacher);}}}public bool CanDeleting(){return true;}#endregion #region INotifyPropertyChanged Memberspublic event PropertyChangedEventHandler PropertyChanged;#endregion#region Methodsprivate void RaisePropertyChanged(string propertyName){// take a copy to prevent thread issuesPropertyChangedEventHandler handler = PropertyChanged;if (handler != null){handler(this, new PropertyChangedEventArgs(propertyName));}}#endregion }
}

结果

参考文献

【C#】MVVM架构-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 学习笔记 - 流程控制 与 Range 类型

前言 任何一门编程语言几乎都脱离不了&#xff1a;变量、基本类型、函数、注释、循环、条件判断&#xff0c;这是一门编程语言的语法基础&#xff0c;只有当掌握这些基础语法及概念才能更好的学习 Rust。 条件判断 if 表达式 if 语句在其他语言中很常见&#xff0c;这里不再…

面试经典150题【1-10】

文章目录 面试经典150题【1-10】88. 合并两个有序数组27.移除元素26.删除有序数组中的重复项80.删除有序数组中的重复项II169.多数元素189.轮转数组121.买卖股票的最佳时机1122. 买卖股票的最佳时机 II55.跳跃游戏![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff…

nvm安装配置环境

前言 对于前端开发人员来说&#xff0c;多个项目可能用的不同的node版本&#xff0c;如何方便快速的转换版本&#xff0c;nvm版本管理工具的出现&#xff0c;解决这个问题。 实战 1. 搜索nvm版本&#xff0c;我用的1.1.2&#xff0c;下载后直接安装。 2.在d盘建立nvm空文件…

uniapp H5唤起手机App 中间下载页

我这里直接是打开中间下载页&#xff0c;在下载页判断手机是否已存在App&#xff0c;有则唤起App&#xff0c;没有则可点击下载按钮下载app。 唤起App的关键语句是&#xff1a;window.location.href scheme Scheme链接格式样式&#xff1a; [scheme]://[host]/[path]?[que…

蓝桥杯:C++队列、优先队列、链表

C普通队列 算法竞赛中一般用静态数组来模拟队列&#xff0c;或者使用STL queue。使用C的STL queue时&#xff0c;由于不用自己管理队列&#xff0c;因此代码很简洁。队列的部分操作如下。 C优先队列 很多算法需要用到一种特殊的队列&#xff1a;优先队列。它的特点是最优数据…

Android下SF合成流程重学习之onMessageInvalidate

Android下SF合成流程重学习之onMessageInvalidate 引言 虽然看了很多关于Android Graphics图形栈的文章和博客&#xff0c;但是都没有形成自己的知识点。每次学习了&#xff0c;仅仅是学习了而已&#xff0c;没有形成自己的知识体系&#xff0c;这次趁着有时间&#xff0c;这次…

pyhton在办公方面的应用

好久没发文了&#xff0c;转眼已经2024年了&#xff0c;我的电脑已经八岁了&#xff0c;近来状况频发&#xff0c;为防止它哪天突然嘎嘣&#xff0c;我多年搜集的资料付诸东流&#xff0c;故决定把资料备份一下这些代码有的是原创&#xff0c;有的是借鉴了其他博主的文章&#…

Python算法100例-1.7 最佳存款方案

完整源代码项目地址&#xff0c;关注博主私信’源代码’后可获取 1.问题描述2.问题分析3.算法设计4.完整的程序 1&#xff0e;问题描述 假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱&#xff0c;他打算在今后5年中的每年年底取出1000元&#xff0c;到第5年时刚…

民安智库如何做新品上市满意度调研

新品上市满意度调研是一种重要的市场研究方法&#xff0c;它通过收集和分析消费者对新产品的态度、购买意愿和满意度等方面的数据&#xff0c;帮助企业了解消费者的需求和期望&#xff0c;发现新产品的问题和不足&#xff0c;从而为产品改进提供有力的数据支持。下面将详细介绍…

什么是生产排产管理系统?哪个最好用?

阅读本文&#xff0c;你将了解&#xff1a;一、生产排产管理系统是什么&#xff1b;二、生产排产管理系统的功能&#xff1b;三、盘点五款好用的生产排产管理系统&#xff1b;四、生产排产管理系统的优势。 一、生产排产管理系统是什么 生产排产&#xff0c;也叫生产计划排程…

智能车竞赛详细介绍

一、引言 随着科技的飞速发展&#xff0c;智能车辆已成为当今研究的热点之一。智能车竞赛作为一项集科技、创新和竞技于一体的活动&#xff0c;为广大学子提供了一个展示才华、交流学习的平台。本文将对智能车竞赛进行详细介绍&#xff0c;包括竞赛背景、目标、赛程安排、技术…

【c++每天一题】跳跃游戏

题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1…

人机工程学和人机交互理论:智能座舱设计

hello家人们...本人熟悉PS、Xd、Ai、Sketch、Figma、墨刀、即时设计、mastergo、Pixso等行业设计软件以及前端开发等技能&#xff0c;拥有10年的UI经验&#xff0c;我们可以通过关注评论私信交流以帮助到您解决UI工作中的烦恼&#xff01;谢谢 人机工程学与人机交互理论&#x…

元宇宙专题:元宇宙概念娱乐应用场景案例研究报告 - 体验驱动篇

今天分享的是元宇宙系列深度研究报告&#xff1a;《元宇宙专题&#xff1a;元宇宙概念娱乐应用场景案例研究报告 - 体验驱动篇》。 &#xff08;报告出品方&#xff1a;艾瑞咨询&#xff09; 报告共计&#xff1a;51页 避免刻舟求剑地探索元宇宙概念产品 对于任何一个宏大而…

【Ubuntu内核】解决Ubuntu 20.04更新内核后无法联网的问题

最近在使用Ubuntu 20.04时&#xff0c;在更新内核后无法进行WiFi联网。我的电脑上装载的是AX211型号的无线网卡&#xff0c;之前安装了相应的驱动&#xff0c;并且一直正常使用。但不小心更新到了Linux 5.15.0-94-generic后&#xff0c;突然发现无法连接网络了。 于是首先怀疑…

【前端工程化面试题】什么是 CI/CD

CI/CD 是软件开发中的两个重要实践&#xff0c;分别代表持续集成&#xff08;Continuous Integration&#xff09;和持续交付/持续部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09;。 持续集成 (Continuous Integration, CI)&#xff1a;持续集成是一种…

常见Web安全漏洞的实际案例和攻防技术

常见Web安全漏洞的实际案例和攻防技术 1、SQL注入攻击与防范: 通过一个简单的Web应用演示SQL注入攻击,包括入侵者如何通过输入恶意SQL语句来获取敏感数据。提供相应的防范措施,包括参数化查询、ORM框架的使用等,并附上实际代码演示。Copy code # 恶意SQL注入语句的示例 SEL…

练习接口测试第一步骤

最近一段时间学了Python语言&#xff0c;重新学了 Java&#xff0c;js&#xff0c;html语言&#xff0c;CSS&#xff0c;linux&#xff0c;一堆测试工具&#xff1b;唉&#xff5e; 在接触接口测试过程中补了很多课&#xff0c; 终于有点领悟接口测试的根本&#xff1b; 偶是…

firewall 常用命令

firewall 常用命令 重新装载 sudo firewall-cmd --reload 列出所有 sudo firewall-cmd --list-all 开启 masquerade 伪装IP firewall-cmd --permanent --add-masquerade 关闭 masquerade 伪装IP firewall-cmd --permanent --remove-masquerade

数据结构~二叉树(基础知识)

上一篇博客我们对树有了初步了解与学习&#xff0c;这篇我将初步学习二叉树&#xff01;&#xff01;&#xff08;新年快乐&#xff01;&#xff09; 目录 二叉树 1、定义&#xff1a; 2、特点&#xff1a; 3、基本形态&#xff1a; 4、二叉树的种类&#xff1a; &…