首页 > 其他分享 >VMMVlight实敲总结 纯新手向

VMMVlight实敲总结 纯新手向

时间:2023-03-15 15:46:53浏览次数:42  
标签:rowAxis rowSeries 实敲 ViewModel 添加 new var 新手 VMMVlight

VMMVlight实敲总结

跟敲教程为:https://www.bilibili.com/video/BV1FS4y1o7nU?p=17&vd_source=960e69b67c5551f583c23efeb5df58cc
导入VMMVlight框架,从nuget包里添加,添加后需要删除

原先的ServiceLocator的引用,添加CommonServiceLocator名空间

fonts 下载FontAwesome 解压后添加已有项,选择fonts下的otf文件

在textBlock中将对应otf文件地址添入FamilyFont,在text中添加入图标的代码即可生成图标

后面可以把Text改为Text="{TemplateBinding Tag}"

然后在前面的需要用到此style内的部分添加Tag="",""内填写对应的图标代码

创建字典的style,不要忘记在app.xaml中写入,不然识别不出


绑定View与ViewModel

  1. 首先,建立对应的ViewModel类文件,此处为LoginWindowViewModel

​ 然后,在View ModelLocator下添加如下代码

  1. 将ViewModelLoactor写入App.xml,这样子ViewModelLoactor就可以作为资源,以Locator的key值被调用

  1. 在对应的view界面再添加如下代码,即可完成View与ViewModel间的绑定

    就可以在view.xmal的界面中调用viewModel中的对象与命令

viewmodel中的对象与命令,具体的看视频吧

创建类AppData用于存放全局的一些数据

在View ModelLocator下添加如下代码,将AppData注册入容器

SimpleIoc.Default.Register<AppData>();

在需要使用全局变量的ViewModel下

在构造函数里将AppData取出赋值

propfull+tab键可以自动生成如下代码

将窗体自身作为命令参数传入

Command="{Binding CheckUserCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:LoginWindow}}"

这块的逻辑是简单的判断登录账号和密码是否与数据库内一致

如果正确会进入主窗口,关闭登录窗口。此处,登录窗口将自身作为参数传入,以实现最后的loginWindow.close()

关于提示框,ShowMessageBox方法来自接口IDialogService。在view中LoginWindow的cs文件中,实现IDialogService接口。将IDialogService接口和实现它的LoginWindow注册进IOC,即红线所示。然后就可以被上图的SimpleIOC.Default.GetInstance<IDialogService>();获取实例了

数据库实体的查找,如果想通过表1获得含有关系的表2内字段内容,可以这么写,其中UserInfo是通过关系获取的表2内字段内容,并不是Line表本身包含的数据

关闭自身的数据绑定,传入的命令的参数是该窗体本身

插入数据

利用i:Interaction将事件当作命令用,绑定方式如下。找不到对应modelView中写的command,根据dataContext(在xaml的开始,用DataContext绑定了ViewModel,使得View与ViewModel绑定)去获取ViewModel中的命令

 <i:Interaction.Triggers>
     <i:EventTrigger EventName="MouseUp">
           <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:LineView}, Path=DataContext.OpenEditLineWindowCommand}"/>
     </i:EventTrigger>
  </i:Interaction.Triggers>

实现第三个表原意的正确写法(对应第17课前半部分做的内容)

//3.停机子线柱状图
vm.RowSubLineAxis.Clear();
vm.RowSubLineSeries.Clear();
Axis rowAxis = new Axis();
rowAxis.ShowLabels = true;
rowAxis.Labels = new List<string>();
rowAxis.Separator = new LiveCharts.Wpf.Separator() { Step = 1 };
rowAxis.Height = 10;
foreach (var subline in subLines)
{
    var values = new ChartValues<double>();
    var Names = new List<string>();
    var rowSeries = new RowSeries();
    rowSeries.Values = new ChartValues<double>();
    rowSeries.Title = subline.Name;
    rowSeries.DataLabels = true;
    rowSeries.Foreground = Brushes.White;
    foreach (var line in lines)
    {
        var list = tempHistories.FindAll(t => t.SubLineId == subline.Id && t.LineId==line.Id);
        var sumMinutes = list.Sum(item => (item.EndTime - item.StartTime).TotalMinutes);
                          rowSeries.Values.Add(sumMinutes);
                          
     }
     vm.RowSubLineSeries.Add(rowSeries);

}
foreach (var line in lines)
    rowAxis.Labels.Add($"{line.Name}");
vm.RowSubLineAxis.Add(rowAxis);

究其根本,就是让 rowSeries.Title = subline.Name; 确保大小循环的对应。

var rowSeries = new RowSeries();每new一个就会出现一个颜色的统计条,可以理解为正常情况下的所有生产线的同一个子线颜色要一样,1-1一个色,1-2一个色,类推。因此每循环一次子线就new一次

杂项问题汇总

comboBox的Text只能显示其包含项的内容,不然会无法显示,表现为空

propdp

用于较复杂的界面与属性关联

DependencyProperty:https://blog.csdn.net/albert528108/article/details/51671787

ComboBox SelectionChanged并不是选项changed完的一个过程,而是选择了某项,还没能把值赋过去时就触发了

如果想要的效果是不仅选择了某项,还想要获得某项的内容,改用DropDownClosed

comboBox的text想绑定实体的具体名字,不要直接把一个实体类绑上去

所有含类的东西赋值前先实例化new一下,求求了,报空值错误80%是因为这个

对于找不到某项下的xx内容,但是内容存在时,先重新生成解决方案就能找到

Converter位置,如果写在app里会找不到

写在style上就可以

在界面上右键对应的控件,可以编辑模板样式,选择编辑模板会生产默认样式在xaml里,作为style

Border不可以直接套Column,但是可以套grid,grid可以套Column

设置WindowsChrome可以去掉窗体上白边

WindowChrome.IsHitTestVisibleInChrome="True"防止chrome遮盖掉需要交互的控件

标签:rowAxis,rowSeries,实敲,ViewModel,添加,new,var,新手,VMMVlight
From: https://www.cnblogs.com/someclouds/p/17218683.html

相关文章

  • ChIP-seq | ATAC-seq | Cut&Run | 新手指南
     没想到我是先玩了Cut&Run和单细胞ATAC-seq,搞通了再来分析ChIP-seq|ATAC-seq,因为之前接触到的数据太烂了,所以什么有意义的东西都没搞出来,又没有重复,导致分析和评估无从......
  • 新手学软件测试能学得好吗?
    如果你想转行到IT行业,软件测试是一门相对简单的学科,非常适合零基础的人学习。如果你决心学好软件测试并充满兴趣,那么学习就不会太难。如果你是转行的人,买本软件测试书......
  • uniapp+django 新手学习步骤记录
    1.Django项目和uni-app项目的创建及项目文件讲解_慕容星言的博客-CSDN博客 注意同时安装了python2和python3,pip记得用pip3用pythonmanage.pystartappuniappclient创......
  • Docker 新手教程(镜像,容器)
    DOCKER根据镜像创建:sudodockercreate-itimg_name启动容器:sudodockerstartcon_name停止容器:dockerstopcon_name删除容器:dockerrmcon_name改名:dockerrename......
  • 【经验分享】电路板上电就挂?新手工程师该怎么检查PCB?
    小伙伴们有没有经历过辛辛苦苦,加班加点设计的PCB,终于搞定下单制板。接下来焦急并且忐忑地等待PCB板到货,焊接,验证,一上电,结果直接挂了...连忙赶紧排查,找问题。最终发现,是打过......
  • Terraform 新手村指南,萌新必读!
    基础设施即代码(IaC)是指使用代码和软件开发技术来配置和管理基础设施的实践。IaC背后的逻辑是尽量消除手动配置基础设施和资源的需求,比如服务器、负载均衡以及数据库等。由......
  • 测开必知:Docker 从入门到精通(新手大全)!
    测试开发技术公众号:https://mp.weixin.qq.com/s/Uy25G68jiminKAIHi9EKRA  一、概述1.1基本概念Docker是一个开源的应用容器引擎,基于Go语言 并遵从Apache2.0......
  • 新手学习单片机的首选到底是什么?
    一、首先为什么要先学51单片机?​因为51单片发展最早,应用最广泛,特别是I/O口的操作非常简单,而且相关的学习资料最多、教材最成熟,学习起来得心应手,入门很快。有了这个基础再去......
  • 新手:python里面while循环2——代码优化
    上一笔记里面,有大量重复的代码,这次来进行优化,如果有其他方法,请教教我,respect!点击查看代码#-*-coding:utf-8-*-#__author:AndyLiu#Date:2023/3/2menu={......
  • Linux新手渣渣上路史
    Linux新手渣渣上路史时至2022年,IT行业的迅速发展大家也有目共睹,IT行业在社会的发展中起着举足轻重的作用。其中一角Linux系统,从诞生到开源,再到现在受大众的欢迎,是一个很好......