基于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.hqwc.cn/news/483483.html

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

相关文章

docker pullpush 生成镜像文件并push 到阿里云

pull docker docker pull ultralytics/ultralytics # 拉取yolov8的镜像仓库 docker run -it ultralytics/ultralytics # 运行镜像 conda create -n gsafety python3.8 # 创建环境 source activate gsafety # 激活环境 pip install -i https://pypi.tuna.tsinghua.edu.cn/simp…

安卓开发:挑战每天发布一个封装类02--Wav录音封装类AudioChannel 1.0

简介 库名称&#xff1a;AudioChannel 版本:1.0 由于项目需求录音并base64编码存到服务器中&#xff0c;就顺手改装了一个别人的封装类 原封装类地址:Android AudioRecord音频录制wav文件输出 - 简书 (jianshu.com) 描述&#xff1a;此封装类基于AudioRecord实现wav的音频…

Cesium 问题:加载 gltf 格式的模型之后太小,如何让相机视角拉近

文章目录 问题分析问题 刚加载的模型太小,如何拉近视角放大 分析 在这里有两种方式进行拉近视角, 一种是点击复位进行视角拉近一种是刚加载就直接拉近视角// 模型三加载 this.damModel = new Cesium.Entity({name: "gltf模型",position:</

Aster实现一台电脑当两台使——副屏搭配键鼠

前言&#xff1a;笔者每年回家&#xff0c;都面临着想要和小伙伴一起玩游戏&#xff0c;但小伙伴没有电脑/只有低配电脑的问题。与此同时&#xff0c;笔者自身的电脑是高配置的电脑&#xff0c;因此笔者想到&#xff0c;能否在自己的电脑上运行游戏&#xff0c;在小伙伴的电脑上…

实战打靶集锦-025-HackInOS

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查5. 提权5.1 枚举系统信息5.2 探索一下passwd5.3 枚举可执行文件5.4 查看capabilities位5.5 目录探索5.6 枚举定时任务5.7 Linpeas提权 靶机地址&#xff1a;https://download.vulnhub.com/hackinos/HackInOS.ova 1. 主机…

《穿越科技的前沿:计算机专业必看的电影盛宴》

文章目录 每日一句正能量前言电影推荐推荐一&#xff1a;《黑客帝国》推荐二&#xff1a;《社交网络》推荐三&#xff1a;《源代码》推荐四&#xff1a;《谍影重重》系列推荐五&#xff1a;《旋转木马》 技术与主题后记 每日一句正能量 一个人的一生&#xff0c;就是一座有了年…

Java Web(七)__Tomcat(二)

Tomcat工作模式 Tomcat作为Servlet容器&#xff0c;有以下三种工作模式。 1&#xff09;独立的Servlet容器&#xff0c;由Java虚拟机进程来运行 Tomcat作为独立的Web服务器来单独运行&#xff0c;Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。…

『防骗指南』OpenAI官方提供的Sora体验资格申请渠道只有这两个!附内测申请链接!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

回显服务器的制作方法

文章目录 客户端和服务器TCP和UDP的特点UDP socket api的使用DatagramSocketDatagramPacketInetSocketAddress API 做一个简单的回显服务器UDP版本的回显服务器TCP版本的回显服务器 客户端和服务器 在网络中&#xff0c;主动发起通信的一方是客户端&#xff0c;被动接受的这一方…

【快速上手QT】04-定时器Timer

先来个小示例 我们先简单的来触发一下定时器。 #include "Zhetu.h"#include <qdebug.h>void Zhetu::timerEvent(QTimerEvent* event) { //定时器触发函数qDebug() << "Hello world"; }Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){t…

Py之pydantic:pydantic的简介、安装、使用方法之详细攻略

Py之pydantic&#xff1a;pydantic的简介、安装、使用方法之详细攻略 目录 pydantic的简介 1、Pydantic V1.10 vs. V2 pydantic的安装 pydantic的使用方法 1、简单的示例 pydantic的简介 pydantic是使用Python类型提示进行数据验证。快速且可扩展&#xff0c;Pydantic与您…

车灯裂了用什么胶修复?

当车灯出现裂缝、破口、缺损、裂痕、破裂、破损、崩角、掉角等问题时&#xff0c;可以使用车灯无痕修复专用UV胶进行修复。车灯无痕修复专用UV胶是一种经过处理的UV树脂胶&#xff0c;主要成份是改性丙烯酸UV树脂。应用在车灯的专业无痕修复领域。 具有如下特点&#xff1a; 1…