排一次开发C#遇到的坑,同时说一下自己对C#中文件夹构建方式的体会。
一个开发Java的人留下了痛苦的泪水,变量命名规则不一样,连括号打的都不一样,??
C#中的解决方案<>Java中的项目
C#中的项目<>Java中的包
本篇文章如有不对的地方,欢迎在评论下方留言,或者私信博主。毕竟第一次开发C#,自己都有点懵逼/(ㄒoㄒ)/~~。
C#WPF线程更新控件
在数据进行更新的页面交互中,我们肯定会将数据更新的函数逻辑放到线程中去,因为数据请求是一个耗时的操作,相信没有谁愿意让自己的页面隔一段时间卡一下。But,如果我们直接在线程中对控件进行修改,会出现这样一个错误
为什么呢?
因为在C#中,非UI线程是不能修改UI控件的。那么如果我们一定要修改控件应该怎么办呢?很简单,将UI修改的函数交给UI线程去做就行了。
this.Dispatcher.BeginInvoke(new Action(()=>change()));// change()代表控件修改的函数
C#进行数据绑定,数据更新成功,但是控件更新失败
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的控件名字
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#开发的坑吧。