`
wangleifire
  • 浏览: 514047 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于WPF 数据绑定简单介绍及入门

    博客分类:
  • c#
阅读更多

 

今天搞了一下午的数据绑定,由于以前用FLEX的数据绑定很爽,而且思维定视,造成了难于理解WPF数据绑定,遇到几个难题

 1.不知道如何入门

 2.找到的例子都太高深,看不懂,正因如此,作者准备自己写一个最简单最好理解的入门

 3.容易出错,明明用的是TextBox绑定,写成了TextBlock所以一直没得到结果.同志们小心啦!!!

下面下接上一个例子供大家学习:

首先定义一个Student类,我比较懒,所以造成这个Student只有一个属性Id ,然后进行绑定

  1. public   class  Student : INotifyPropertyChanged  
  2. {  
  3.     public   event  PropertyChangedEventHandler PropertyChanged;  // 这个接口仅包含一个事件而已   
  4.   
  5.     private   int  id;  
  6.     public   int  Id  
  7.     {  
  8.         get  {  return  id; }  
  9.         set   
  10.         {  
  11.             id = value;  
  12.             if  ( this .PropertyChanged !=  null )  
  13.             {  
  14.   
  15.                 this .PropertyChanged.Invoke( this new  PropertyChangedEventArgs( "Id" ));  // 通知Binding是“Id”这个属性的值改变了   
  16.             }  
  17.         }  
  18.     } 
  19. }

下面这段代码你可以写在任何地方,只要在你需要绑定的时候用就行了.tbBind是TexbBlock

Binding bind = new Binding() ;

bind.Source = this.student ;

bind.Path = new PropertyPath("Id") ;

bind.Mode = BindingMode.TwoWay ;

bind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged ;

this.tbBind.SetBinding(TextBox.TextProperty, bind) ;

下面再来一个别人的例子,一起观赏,

 

深入浅出话Binding

Binding同学最近很不开心,是因为它的中文名字“很暴力”——绑定。我猜,最早的译者也没什么标准可遵循,大概是用了谐音吧!这一谐音不要 紧,搞的中国程序员就有点摸不清头脑了。“绑”是捆绑的意思,再加上一个“定”字,颇多了几分“绑在一起、牢不可分”的感觉。而实际呢?Binding却 是个地地道道的松耦合的关系!

依在下拙见,Binding译为“关联”是再合适不过了 。在英语词典里,也的确有这一词条。关联吗,无需多讲,人人都知道是“之间有些关系”的意思。Data Binding也就不应该再叫“数据绑定”了,应该称为“数据关联”,意思是说,在数据和界面(或其他数据)之间具有某些关系和联动。

具体到WPF中,Binding又是怎样一种关系和联动呢?就像我们的大标题一样——Binding就是数据的“绿色通道”。“绿色通道”代表着“直接”和“快速”,Binding就是这样。

让我们分享一个有趣的例子,请看下面的截图:

这里是两个TextBox和一个Slider组成的UI,现在客户的需求是——当Slider的滑块移动时,上面那个TextBox里显示 Slider的Value;反过来,当在上面那个TextBox里输入合适的值后,鼠标焦点移开后,Slider的滑块也要滑到相应的位置上去。

站在一个WinForm程序员的角度去考虑,他会做这样几件事情:

  1. 响应slider1的ValueChanged事件,在事件处理函数中让textBox1显示slider1的Value
  2. 响应textBox1的LostFocus事件,把textBox1的Text转换成数值,并赋值给slider1

注意了!这就是典型的“非数据驱动界面”的思想。为什么呢?

当我们响应slider1的ValueChanged事件时,我们要的是slider1的Value这个值,这时候,slider1处于核心地位、 是数据的“源”(Source);当我们响应textBox1的LostFocus事件时,我们需要的是它的Text属性值,这时候,textBox1又 成了数据的source。也就是说,在这种处理方法中,数据没有固定的“源”,两个UI元素是对等的、不存在谁从属于谁的问题。换句话说:它们之间是“就 事论事”,并没有什么“关联”。

接下来,让我们体验一下“绿色通道”的快捷!

上述例子的XAML源代码如下:

  1. < Window   x:Class = "BindingSample.Window1"   
  2.     xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
  3.     xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"   
  4.     Title = "http://blog.csdn.net/FantasiaX"   Height = "300"   Width = "300" >   
  5.     < Window.Background >   
  6.         < LinearGradientBrush   StartPoint = "0,0"   EndPoint = "1,1" >   
  7.             < GradientStop   Color = "Blue"    Offset = "0.3" />   
  8.             < GradientStop   Color = "LightBlue"   Offset = "1" />   
  9.         </ LinearGradientBrush >   
  10.     </ Window.Background >   
  11.     < Grid >   
  12.         < TextBox   Height = "23"   Margin = "10,10,9,0"   Name = "textBox1"   VerticalAlignment = "Top"   />   
  13.         < TextBox   Height = "23"   Margin = "10,41,9,0"   Name = "textBox2"   VerticalAlignment = "Top"   />   
  14.         < Slider   Height = "21"   Margin = "10,73,9,0"   Name = "slider1"   VerticalAlignment = "Top"   Maximum = "100"   />   
  15.     </ Grid >   
  16. </ Window >   
<Window x:Class="BindingSample.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="http://blog.csdn.net/FantasiaX" Height="300" Width="300">
    <Window.Background>
        <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
            <GradientStop Color="Blue"  Offset="0.3"/>
            <GradientStop Color="LightBlue" Offset="1"/>
        </LinearGradientBrush>
    </Window.Background>
    <Grid>
        <TextBox Height="23" Margin="10,10,9,0" Name="textBox1" VerticalAlignment="Top" />
        <TextBox Height="23" Margin="10,41,9,0" Name="textBox2" VerticalAlignment="Top" />
        <Slider Height="21" Margin="10,73,9,0" Name="slider1" VerticalAlignment="Top" Maximum="100" />
    </Grid>
</Window>

剔除那些花里呼哨的装饰品后,最重要的只有下面3行(而实际上第2行那个textBox2只是为了让鼠标的焦点有个去处):

  1. < Grid >   
  2.     < TextBox   Height = "23"   Margin = "10,10,9,0"   Name = "textBox1"   VerticalAlignment = "Top"   />   
  3.     < TextBox   Height = "23"   Margin = "10,41,9,0"   Name = "textBox2"   VerticalAlignment = "Top"   />   
  4.     < Slider   Height = "21"   Margin = "10,73,9,0"   Name = "slider1"   VerticalAlignment = "Top"   Maximum = "100"   />   
  5. </ Grid >   
    <Grid>
        <TextBox Height="23" Margin="10,10,9,0" Name="textBox1" VerticalAlignment="Top" />
        <TextBox Height="23" Margin="10,41,9,0" Name="textBox2" VerticalAlignment="Top" />
        <Slider Height="21" Margin="10,73,9,0" Name="slider1" VerticalAlignment="Top" Maximum="100" />
    </Grid>

然后,我只需在第1行代码上做一个小小的修改,就能完成WinForm中需要用两个事件响应、十多行代码才能完成的事情:

  1. < Grid >   
  2.     < TextBox   Height = "23"   Margin = "10,10,9,0"   Name = "textBox1"   VerticalAlignment = "Top"   Text = "{Binding ElementName=slider1, Path=Value}" />   
  3.     < TextBox   Height = "23"   Margin = "10,41,9,0"   Name = "textBox2"   VerticalAlignment = "Top"   />   
  4.     < Slider   Height = "21"   Margin = "10,73,9,0"   Name = "slider1"   VerticalAlignment = "Top"   Maximum = "100"   />   
  5. </ Grid >   
    <Grid>
        <TextBox Height="23" Margin="10,10,9,0" Name="textBox1" VerticalAlignment="Top" Text="{Binding ElementName=slider1, Path=Value}"/>
        <TextBox Height="23" Margin="10,41,9,0" Name="textBox2" VerticalAlignment="Top" />
        <Slider Height="21" Margin="10,73,9,0" Name="slider1" VerticalAlignment="Top" Maximum="100" />
    </Grid>

细心的你,一定一眼就看到只多了这样一句话:Text="{Binding ElementName=slider1, Path=Value}"

这句话的意思是说:Hi,textBox1,从此以后,你的Text属性值就与slider1这个UI元素的Value属性值关联上了,Value变的时候你的Text也要跟着变

这时候的效果是——你拖动Slider的滑块,textBox1就会显示值(双精度,0到100之间);你在textBox1里输入一个0到100之间的数字,当把鼠标移动到textBox2里时,slider1的滑块会跳到相应的值上去,如图:

 

非常简单是不是?请注意,这里面可蕴含了“数据驱动界面”的模型哦!在这里,我们始终把slider1的Value当成是数据源(Data Source),而textBox1则是用来显示和修改数据的窗口(Data Presenter)——slider1是核心,它的Value属性值将驱动textBox1的Text进行改变;人为改变textBox1的Text属 性值,也会被送回到slider1的Value属性值上去。

是时候让我们了解Data Binding的几个关键概念了——

  1. 数据源(Data Source,简称Source): 顾名思义,它是保有数据的实体、是数据的来源、源头。把谁当作数据源完全由程序员来决定——只要你想把它当做数据核心来使用。它可以是一个UI元素、某个类的实例,也可以是一个集合(关于对集合的绑定,非常重要,专门用一篇文章来讨论之)。
  2. 路径(Path): 数 据源作为一个实体可能保有着很多数据,你具体关注它的哪个数值呢?这个数值就是Path。就上面的例子而言,slider1是Source,它拥有很多数 据——除了Value之外,还有Width、Height等,但都不是我们所关心的——所以,我们把Path设为Value。
  3. 目标(Target): 数据将传送到哪里去?这就是数据的目标了。上面这个例子中,textBox1是数据的Target。有一点需要格外注意:Target一定是数据的接收者、被驱动者,但它不一定是数据的显示者——也许它只是数据联动中的一环——后面我们给出了例子。
  4. 关联(Binding): 数据源与目标之间的通道。正是这个通道,使Source与Target之间关联了起来、使数据能够(直接或间接地)驱动界面!
  5. 设定关联(Set Binding):为Target指定Binding,并将Binding指向Target的一个属性,完成数据的“端对端”传输。

 绿色通道上的“关卡”:

 话说眼看就要到奥运会了,北京的各大交通要道上也都加强了安检力度。微软同学也给Binding这条“绿色通道”准备了几道很实用的“关卡”。这些“关卡”的启闭与设置是通过Binding的属性来完成的。其中常用的有:

  • 如果你想把“绿色通道”限制为“单行道”,那就设置Binding实例的Mode属性,它是一个BindingMode类型 的枚举值,其中包含了TwoWay、OneWay和OneWayToSource几个值。上面这个例子中,默认地是TwoWay,所以才会有双向的数据传 递。
  • 如果用户提出只要textBox1的文本改变slider1的滑块立刻响应,那就设置Binding的 UpdateSourceTrigger属性。它是一个UpdateSourceTrigger类型枚举值,默认值是 UpdateSourceTrigger.LostFocus,所以才会在移走鼠标焦点的时候更新数据。如果把它设置为 UpdateSourceTrigger.PropertyChanged,那么Target被关联的属性只要一改变,就立刻传回给Source——我们 要做的仅仅是改了一个单词,而WinForm程序员这时候正头疼呢,因为他需要去把代码搬到另一个事件响应函数中去。
  • 如果Binding两端的数据类型不一致怎么办?没关系,你可以设置Binding的Converter属性,具体内容在下篇文章中讨论。
  • 如果数据中有“易燃易爆”的不安全因素怎么办?OK,可以设置Binding的ValidationRules,为它加上一组“安检设施”(同样也在下篇文中讨论)。

在C#代码中设置Binding

XAML代码是如此简单,简单就那么一句话。这可不是吾等C#程序员、刨根问底之徒可以善罢甘休的!

形象地讲,Binding就像一个盒子,盒子里装了一些机关用于过滤和控制数据,盒子两端各接着一根管子,管子是由管壳和管芯构成的,看上去就像下面的图:

当脑子里有了这样一个形象之后,遵循下面的步骤就OK了:

  1. Source:确定哪个对象作为数据源
  2. Target:确定哪个对象作为目标
  3. Binding:声明一个Binding实例
  4. 把一根管子接到Source上并把管芯插在Source的Path上
  5. 把另一根管子接到Target上并把管芯插在Target的联动属性上

如果有必要,可以在3与4之间设置Binding的“关卡”们。其实,第3步之后的顺序不是固定的,只是这个步骤比较好记——一概向右连接。所得结果看上去是这样:

我猜你可能会问:“那个D.P.是什么呀?”

D.P.的全称是“Dependency Property”,直译过来就是“依赖式属性”,意思是说它自己本身是没有值的,它的值是“依赖”在其它对象的属性值上、通过Binding的传递和转 换而得来的。表现在例子里,它就是Target上的被数据所驱动的联动属性了!

这里是等价的C#代码,我把它写在了Window1的构造函数里:

  1. public  Window1()  
  2. {  
  3.     InitializeComponent();  
  4.   
  5.     // 1. 我打算用slider1作为Source   
  6.     // 2. 我打算用textBox1作为Target   
  7.     Binding binding = new  Binding();  
  8.     binding.Source = this .slider1;  
  9.     binding.Path = new  PropertyPath( "Value" );  
  10.     this .textBox1.SetBinding(TextBox.TextProperty, binding);              
  11. }  
public Window1()
{
	InitializeComponent();

	// 1. 我打算用slider1作为Source
	// 2. 我打算用textBox1作为Target
	Binding binding = new Binding();
	binding.Source = this.slider1;
	binding.Path = new PropertyPath("Value");
	this.textBox1.SetBinding(TextBox.TextProperty, binding);			
}

有意思的是,Source端的操作,接管子和插管芯分两步,而Target端却是在SetBinding方法中一步完成。注意 啦,TextBox.TextProperty就是一个Dependency Property的庐山真面目!关于Dependency Property的文档业已完成,我将择一黄道吉日挂将出来:p

上面的代码稍有简化的余地,那就是把Path的设定转移到Binding的构造中去:

  1. public  Window1()  
  2. {  
  3.     InitializeComponent();  
  4.       
  5.     // 1. 我打算用slider1作为Source   
  6.     // 2. 我打算用textBox1作为Target   
  7.     Binding binding = new  Binding( "Value" );  
  8.     binding.Source = this .slider1;  
  9.     this .textBox1.SetBinding(TextBox.TextProperty, binding);              
  10. }  
public Window1()
{
	InitializeComponent();
	
	// 1. 我打算用slider1作为Source
	// 2. 我打算用textBox1作为Target
	Binding binding = new Binding("Value");
	binding.Source = this.slider1;
	this.textBox1.SetBinding(TextBox.TextProperty, binding);			
}

这样做的好处是——随便你给binding指定一个Source,只要这个Source有“Value”这个属性,binding就会自动提取它的值并传输给Target端。

我们还可以为binding设些“关卡”:

  1. public  Window1()  
  2. {  
  3.     InitializeComponent();  
  4.   
  5.   
  6.     // 1. 我打算用slider1作为Source   
  7.     // 2. 我打算用textBox1作为Target   
  8.     Binding binding = new  Binding( "Value" );  
  9.     binding.Source = this .slider1;  
  10.     binding.Mode = BindingMode.TwoWay;  
  11.     binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;  
  12.     this .textBox1.SetBinding(TextBox.TextProperty, binding);              
  13. }  
public Window1()
{
	InitializeComponent();


	// 1. 我打算用slider1作为Source
	// 2. 我打算用textBox1作为Target
	Binding binding = new Binding("Value");
	binding.Source = this.slider1;
	binding.Mode = BindingMode.TwoWay;
	binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
	this.textBox1.SetBinding(TextBox.TextProperty, binding);			
}

 还有一个小小的提示:如果Source碰巧是一个UI元素,那么也可将binding.Source = this.slider1;改写成binding.ElementName = "slider1";或者binding.ElementName = this.slider1.Name;

自定义数据源:

在我们项目组日常的工作中,经常需要自己写一个类,并且拿它的实例当作数据源。怎样才能让一个类成为“合格的”数据源呢?

要诀就是:

  1.  为这个类定义一些Property,相当于为Binding提供Path
  2. 让这个类实现 INotifyPropertyChanged接口。实现这个接口的目的是当Source的属性值改变后通知Binding(不然人家怎么知道源头的数据 变了并进行联动协同呢?),好让Binding把数据传输给Target——本质上还是使用事件机制来做,只是掩盖在底层、不用程序员去写event handler了。

 让我们写一个这样的类:

  1. <pre  class = "csharp"  name= "code" > // 第一步:声明一个类,准备必要的属性   
  2.   
  3. public   class  Student   
  4. {  
  5.     private   int  id;  
  6.     public   int  Id  
  7.     {  
  8.         get  {  return  id; }  
  9.         set  { id = value; }  
  10.     }  
  11.   
  12.     private   string  name;  
  13.     public   string  Name  
  14.     {  
  15.         get  {  return  name; }  
  16.         set  { name = value; }  
  17.     }  
  18.   
  19.     private   int  age;  
  20.     public   int  Age  
  21.     {  
  22.         get  {  return  age; }  
  23.         set  { age = value; }  
  24.     }  
  25.   
  26. }</pre>  
  1. // 第一步:声明一个类,准备必要的属性   
  2.   
  3. public   class  Student   
  4. {  
  5.     private   int  id;  
  6.     public   int  Id  
  7.     {  
  8.         get  {  return  id; }  
  9.         set  { id = value; }  
  10.     }  
  11.   
  12.     private   string  name;  
  13.     public   string  Name  
  14.     {  
  15.         get  {  return  name; }  
  16.         set  { name = value; }  
  17.     }  
  18.   
  19.     private   int  age;  
  20.     public   int  Age  
  21.     {  
  22.         get  {  return  age; }  
  23.         set  { age = value; }  
  24.     }  
  25.   
  26. }  
// 第一步:声明一个类,准备必要的属性

public class Student 
{
	private int id;
	public int Id
	{
		get { return id; }
		set { id = value; }
	}

	private string name;
	public string Name
	{
		get { return name; }
		set { name = value; }
	}

	private int age;
	public int Age
	{
		get { return age; }
		set { age = value; }
	}

}

 接下来就是使用INotifyPropertyChanged接口“武装”这个类了,注意,这个接口在System.ComponentModel名称空间中:

  1. // 第二步:实现INotifyPropertyChanged接口   
  2.   
  3. public   class  Student : INotifyPropertyChanged  
  4. {  
  5.     public   event  PropertyChangedEventHandler PropertyChanged;  // 这个接口仅包含一个事件而已   
  6.   
  7.     private   int  id;  
  8.     public   int  Id  
  9.     {  
  10.         get  {  return  id; }  
  11.         set   
  12.         {  
  13.             id = value;  
  14.             if  ( this .PropertyChanged !=  null )  
  15.             {  
  16.   
  17.                 this .PropertyChanged.Invoke( this new  PropertyChangedEventArgs( "Id" ));  // 通知Binding是“Id”这个属性的值改变了   
  18.             }  
  19.         }  
  20.     }  
  21.   
  22.   
  23.     private   string  name;  
  24.     public   string  Name  
  25.     {  
  26.         get  {  return  name; }  
  27.         set   
  28.         {  
  29.             name = value;  
  30.             if  ( this .PropertyChanged !=  null )  
  31.             {  
  32.                 this .PropertyChanged.Invoke( this new  PropertyChangedEventArgs( "Name" ));  // 通知Binding是“Name”这个属性的值改变了   
  33.             }  
  34.         }  
  35.     }  
  36.   
  37.     private   int  age;  
  38.     public   int  Age  
  39.     {  
  40.         get  {  return  age; }  
  41.         set  { age = value; }  // Age的值改变时不进行通知   
  42.     }  
// 第二步:实现INotifyPropertyChanged接口

public class Student : INotifyPropertyChanged
{
	public event PropertyChangedEventHandler PropertyChanged; // 这个接口仅包含一个事件而已

	private int id;
	public int Id
	{
		get { return id; }
		set
		{
			id = value;
			if (this.PropertyChanged != null)
			{

				this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Id")); // 通知Binding是“Id”这个属性的值改变了
			}
		}
	}


	private string name;
	public string Name
	{
		get { return name; }
		set
		{
			name = value;
			if (this.PropertyChanged != null)
			{
				this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name")); // 通知Binding是“Name”这个属性的值改变了
			}
		}
	}

	private int age;
	public int Age
	{
		get { return age; }
		set { age = value; } // Age的值改变时不进行通知
	}

  1. OK,此时,你可以尝试使用Student类的实例作为数据源了! 
分享到:
评论

相关推荐

    远程debug流程,方便debug

    远程debug流程,方便debug

    基于麻雀生物特性的搜索算法(SSA)的Matlab实现:原理、代码与实战应用,基于圈养麻雀特性的搜索算法(SSA)matlab实现:原理、代码与警觉机制解析,麻雀搜索算法(SSA)的matlab实现

    基于麻雀生物特性的搜索算法(SSA)的Matlab实现:原理、代码与实战应用,基于圈养麻雀特性的搜索算法(SSA)matlab实现:原理、代码与警觉机制解析,麻雀搜索算法(SSA)的matlab实现 原创代码,注释清晰,可直接运行 研究表明,圈养的麻雀存在两种不同类型:发现者和加入者。 发现者在种群中负责寻找食物并为整个麻雀种群提供觅食区域和方向,而加入者则是利用发现者来获取食物。 在生活中我们仔细观察会发现,当群体中有麻雀发现周围有捕食者时,此时群体中一个或多个个体会发出啁啾声,一旦发出这样的声音整个种群就会立即躲避危险,进而飞到其它的安全区域进行觅食。 这样的麻雀被称为警觉者。 麻雀搜索算法就是利用麻雀的这种生物特性进行迭代寻优的优化算法。 本资源包含以下三部分内容: 1.麻雀搜索算法的基本原理(两篇参考文献),非常适合用来学习。 2.麻雀搜索算法的matlab代码,注释详细,结构清晰。 3.五个群智能优化算法常用的测试函数。 ,麻雀搜索算法(SSA); MATLAB实现; 原创代码; 注释清晰; 可直接运行; 生物特性迭代寻优; 发现者与加入者; 警觉者; 参考两篇文献。

    基于java的五子棋游戏设计源码+论文

    基于java的五子棋游戏设计源码+论文

    deepseek-r1使用指南

    deepseek-r1使用指南

    DeepSeek+DeepResearch-让科研像聊天一样简单

    DeepSeek+DeepResearch——让科研像聊天一样简单 (1)DeepSeek如何做数据分析? (2)DeepSeek如何分析文件内容? (3)DeepSeek如何进行数据挖掘? (4)DeepSeek如何进行科学研究? (5)DeepSeek如何写综述? (6)DeepSeek如何进行数据可视化? (7)DeepSeek如何写作润色? (8)DeepSeek如何中英文互译? (9)DeepSeek如何做降重? (10)DeepSeek论文参考文献指令 (11)DeepSeek基础知识。

    基于dlib及opencv的人脸识别.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    基于人工智能的目标检测应用.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    DSP28335通过SPI与AD7606八路信号采集与通信的实践:实时数值与波形展示在上位机界面上,DSP28335与AD7606 SPI通信:采集八路信号并通过SCI上送至上位机实现数据及波形显示

    DSP28335通过SPI与AD7606八路信号采集与通信的实践:实时数值与波形展示在上位机界面上,DSP28335与AD7606 SPI通信:采集八路信号并通过SCI上送至上位机实现数据及波形显示,Dsp28335利用spi与ad7606通信,采集八路信号,通过sci发送到到上位机显示数值和波形 ,DSP28335; SPI; AD7606; 八路信号采集; SCI; 上位机显示; 数值和波形,DSP28335 SPI通讯 AD7606 八路信号采集 SCI发送上位机显示

    搭建mario机器学习测试系统,进行机器学习。.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    marisa-ruby-0.2.4-4.el7.x64-86.rpm.tar.gz

    1、文件内容:marisa-ruby-0.2.4-4.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/marisa-ruby-0.2.4-4.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    基于Tent混沌映射的麻雀搜索算法优化:提高全局搜索能力与初始解质量,基于Tent混沌映射的麻雀搜索算法优化:提高全局搜索能力与初始解质量,基于Tent混沌映射的麻雀搜索算法matlab代码: 针对麻

    基于Tent混沌映射的麻雀搜索算法优化:提高全局搜索能力与初始解质量,基于Tent混沌映射的麻雀搜索算法优化:提高全局搜索能力与初始解质量,基于Tent混沌映射的麻雀搜索算法matlab代码: 针对麻雀搜索算法(SSA)在接近全局最优时,种群多样性减少,易陷入局部最优解等问题,提出了一种混沌麻雀搜索优化算法(CSSA)。 通过改进 Tent 混沌序列初始化种群,提高初始解的质量,增强算法的全局搜索能力; ,基于Tent混沌映射的麻雀搜索算法; CSSA(混沌麻雀搜索优化算法); Tent混沌序列初始化种群; 全局搜索能力。,基于Tent混沌映射的CSSA算法:提高麻雀搜索全局搜索能力

    JavaWeb期刊管理系统_课程设计附课设报告.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    上接战略下接绩效的培训规划.pptx

    上接战略下接绩效的培训规划.pptx

    基于S7-300 PLC和Wincc Flexible触摸屏的温室大棚智能控制解决方案:梯形图程序详解、接线与原理图图谱及组态设计,基于S7-300 PLC与Wincc Flexible触摸屏的温室大

    基于S7-300 PLC和Wincc Flexible触摸屏的温室大棚智能控制解决方案:梯形图程序详解、接线与原理图图谱及组态设计,基于S7-300 PLC与Wincc Flexible触摸屏的温室大棚智能控制解决方案:梯形图程序、接线图与组态画面全解析,No.943 基于S7-300 PLC和Wincc Flexible触摸屏温室大棚控制 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面 ,943; S7-300 PLC; Wincc Flexible触摸屏; 温室大棚控制; 梯形图程序; 接线图原理图; IO分配; 组态画面,S7-300 PLC与Wincc Flexible触摸屏联合打造:No.943温室大棚控制系统的设计与实现

    基于ADMM算法的GAMS程序:发电商竞标策略模型及其应用解析,GAMS程序解析:基于ADMM算法的发电商竞标策略优化模型与代码实现,GAMS程序:ADMM算法-基于ADMM法的发电商竞标策略 本程序

    基于ADMM算法的GAMS程序:发电商竞标策略模型及其应用解析,GAMS程序解析:基于ADMM算法的发电商竞标策略优化模型与代码实现,GAMS程序:ADMM算法-基于ADMM法的发电商竞标策略 本程序主要介绍ADMM算法在GAMS中的编写方式,模型基于发电商竞标策略进行编写,基本包含了文章中的模型,但并非完全复现,可作为参考程序自学使用,也可在程序的基础上进行修改使用。 需要的同学可根据以下图片研究是否为自己需要的程序进行。 也可提供ADMM部分程序。 程序包括两个,分别为解决战略投资问题的广义MILP制定的GAMS代码、基于提出的共识- admm算法解决战略投资问题的GAMS代码 ,GAMS程序; ADMM算法; 发电商竞标策略; 模型编写; 广义MILP; 共识-ADMM算法; 战略投资问题; 程序修改。,GAMS程序:ADMM算法在发电商竞标策略中的应用示例

    springboot整合Quartz实现动态配置定时任务.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    重庆市农村信用合作社 农商行数字银行系统建设方案.ppt

    重庆市农村信用合作社 农商行数字银行系统建设方案.ppt

    三菱FX5U定位模块与昆仑通态触摸屏包装机配置程序集成:五轴控制及双轴插补技术,三菱FX5U定位模块与伺服系统控制:包装机配置清单及功能分配手册,三菱 FX5U定位模块5轴 2轴插补伺服 包括三菱FX

    三菱FX5U定位模块与昆仑通态触摸屏包装机配置程序集成:五轴控制及双轴插补技术,三菱FX5U定位模块与伺服系统控制:包装机配置清单及功能分配手册,三菱 FX5U定位模块5轴 2轴插补伺服 包括三菱FX5U伺服5轴程序2轴插补,昆仑通态触摸屏程序。 包装机程序,有详细配置清单 IO表 功能分配等清单 扩展FX5-16ET-ES-H定位,有定位设置说明 ,三菱FX5U;定位模块;5轴;2轴插补伺服;昆仑通态触摸屏程序;包装机程序;配置清单;IO表;功能分配;扩展FX5-16ET-ES-H定位设置。,三菱FX5U定位模块:5轴伺服控制与2轴插补程序包

    机器学习课程设计——基于AdaBoost的银行用户逾期行为检测.zip

    项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行;功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    恶性肿瘤骨转移临床诊疗专家共识总论要点解读.pptx

    恶性肿瘤骨转移临床诊疗专家共识总论要点解读.pptx

Global site tag (gtag.js) - Google Analytics