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遮盖掉需要交互的控件

posted @ 2023-03-15 15:31  某云  阅读(157)  评论(0)    收藏  举报