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
- 首先,建立对应的ViewModel类文件,此处为LoginWindowViewModel
然后,在View ModelLocator下添加如下代码
- 将ViewModelLoactor写入App.xml,这样子ViewModelLoactor就可以作为资源,以Locator的key值被调用
-
在对应的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