排一次开发C#遇到的坑,同时说一下本身对C#中文件夹构建方式的体会。html
一个开发Java的人留下了痛苦的泪水,变量命名规则不同,连括号打的都不同,😔mysql
C#中的解决方案<>Java中的项目linux
C#中的项目<>Java中的包sql
本篇文章若有不对的地方,欢迎在评论下方留言,或者私信博主。毕竟第一次开发C#,本身都有点懵逼/(ㄒoㄒ)/~~。数据库
在数据进行更新的页面交互中,咱们确定会将数据更新的函数逻辑放到线程中去,由于数据请求是一个耗时的操做,相信没有谁愿意让本身的页面隔一段时间卡一下。But,若是咱们直接在线程中对控件进行修改,会出现这样一个错误c#
为何呢?windows
由于在C#中,非UI线程是不能修改UI控件的。那么若是咱们必定要修改控件应该怎么办呢?很简单,将UI修改的函数交给UI线程去作就好了。ide
this.Dispatcher.BeginInvoke(new Action(()=>change()));// change()表明控件修改的函数
TextBlock控件进行绑定的代码以下:函数
// 建立一个TextBlock控件
TextBlock block = new TextBlock();
// 对象字典
private Dictionary<string,SensorDataDao> controllerDataDictionary = new Dictionary<string, SensorDataDao>();
// 进行数据绑定
BindingOperations.SetBinding(block, TextBlock.TextProperty, new Binding()
{
// controllerDataDictionary[tagApi]为绑定的对象
Source = controllerDataDictionary[tagApi],
// 被绑定对象的属性
Path = new PropertyPath("Name"),
// 绑定的方式
Mode = BindingMode.TwoWay,
});
绑定对象的类:工具
刚开始我建立类的时候,我忘记继承INotifyPropertyChanged
这个类了,若是咱们不继承这个类,数据绑定不会失败,也就是说,TextBlock的Text内容仍然会显示,可是你进行改变的时候,Text内容并不会进行改变。
using System;
using System.ComponentModel;
namespace DataDao
{
public class SensorDataDao:INotifyPropertyChanged
{
private string _Name;
public string Name
{
set
{
if (value == _Name) return;
_Name = value;
Notify("Name");
}
get => _Name;
}
public event PropertyChangedEventHandler PropertyChanged;
public void Notify(string propertyName) {
if (PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
接下来就是我遇到的问题,当我进行wpf 数据绑定的时候,PropertyChanged一直为空,而TextBlock的Text内容也没发生改变,但是个人数据已经改变了(不得不说Visual studio debug模式真香)。
个人数据进行该改变的函数是这样的:
controllerDataDictionary[ApiTag] = new SensorDataDao
{
Name = "新的名字",
};
原本我以为没什么问题的,当是冥冥中,我忽然想到,为何控件进行数据绑定后,会随着数据发生改变呢?是否是由于控件绑定的是对象的内存地址呢(以上是我猜想的,不肯定对不对)?但是在上面的更改中,咱们能够明显的知道,咱们进行数据更新是创造了一个新的对象,并非原先的对象,因此TextBlock绑定的仍是原先的对象,值并无进行改变。
因此咱们须要这样作:
controllerDataDictionary[ApiTag].Name = "新的名字";
这个控件进行绑定的对象就进行修改了。
在上一步咱们说了绑定的内容,可是在DataGrid控件中,仿佛就不生效了,即便DataGrid绑定了内容,内容在线程数据进行更新,可是显示的数据却并无进行更新。真的是我有橘麻麦皮不知当桨不当桨。
直接给解决方法了:
// 在线程中刷新数据,其中dataGrid为DataGrid的控件名字
dataGrid.Dispatcher.BeginInvoke(new Action(() => dataGrid.Items.Refresh()));
由于我一直用的是linux进行开发,因此这一次用windows开发的时候遇到了数据链接的问题。
在我安装好mysql后,使用命令行可以进去,以下图所示:
当是,一旦我使用数据库可视化工具,进行数据库链接就出现了如下的问题:(我使用的是DataGrip可视化工具,不肯定其余数据库可视化工具会不会遇到这个坑),而后发现死活链接不上。
后面google了一下:发现咱们的URL须要这样链接
jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
这样的话,咱们就能够开开心心的使用数据库可视化工具了。
这篇博客持续更新,慢慢的排C#开发的坑吧。