惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MongoDB | Blog
MongoDB | Blog
Recorded Future
Recorded Future
Jina AI
Jina AI
The Register - Security
The Register - Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
博客园 - 【当耐特】
雷峰网
雷峰网
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
Security Latest
Security Latest
有赞技术团队
有赞技术团队
L
Lohrmann on Cybersecurity
P
Proofpoint News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
P
Privacy & Cybersecurity Law Blog
Scott Helme
Scott Helme
Google Online Security Blog
Google Online Security Blog
WordPress大学
WordPress大学
Hacker News - Newest:
Hacker News - Newest: "LLM"
NISL@THU
NISL@THU
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
Cyberwarzone
Cyberwarzone
K
Kaspersky official blog
F
Full Disclosure
Martin Fowler
Martin Fowler
Spread Privacy
Spread Privacy
D
Docker
C
Cisco Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
H
Hacker News: Front Page

博客园 - 圣炎¢天乐

Eds 公司 武汉 2008.2招聘 EDS 公司专用英文简历模板 GAT&GAX群 如何写自己的Guidance Packages(一) (转)聚簇索引与非聚簇索引的区别以及SQL Server查询优化技术 GAT & GAX 简介 技巧/诀窍:在ASP.NET中重写URL 微软发布WF教程及大量示例 Web Service Software Factory SEO课程笔记(二) SEO课程笔记 InfoPath 2007 的一些开发资源 WPF的最新开发资料和文档 关于WPF的外观设计 - 圣炎¢天乐 - 博客园 Page Controller (页面控制器)和Front Controller(前端控制器) MVC设计模式 编写自定义 HTTP 模块 关于.net中访问InfoPath 2007 的权限配置???? ADO.NET性能改善方法集合
WPF数据绑定
圣炎¢天乐 · 2007-05-20 · via 博客园 - 圣炎¢天乐

WPF中对于数据绑定有三种方式,

1.         对于xml数据的绑定,可以通过添加XML Data Source完成,这个在Blend里面通过Project-àData-à+XML完成添加,然后将生成的XML Data Source拖到要绑定的数据上即可.

2.         两个控件属性的绑定,这个只要在目标控件属性的扩展属性窗口中编辑一下绑定,即可,与前一种大同小异.

3.         对于CLR Object的绑定,这种最灵活,也最复杂.首先,需要将集合数据包装成ObservableCollection,该类属于System.Collections.ObjectModel命名空间,需要引用WindowsBase.dll. 该部分代码如下:

 

private ObservableCollection<ProductInfo> productPhotos1 = new ObservableCollection<ProductInfo>(); 
  
     
public ObservableCollection<ProductInfo> ProductPhotos1 
     
get return this.productPhotos1; } } 
  
private void GetData()      //用于获取数据集合 
    
            ProductPhotosTableAdapters.ProductsTableAdapter da 
= 
                
new ProductPhotosTableAdapters.ProductsTableAdapter(); 
            ProductPhotos.ProductsDataTable dt 
= da.GetData(); 
            productPhotos1.Clear(); 
            
foreach (ProductPhotos.ProductsRow row in dt)    //包装为ObservableCollection 
            
                productPhotos1.Add(
new ProductInfo( 
                    row.ProductID, 
                    row.ProductName)); 
                  
            }
  
     }


最后再包装GetData方法为一个ICommand类型,该接口属于System.Windows.Input命名空间,因此,需要引用PresentationCore.dll

该部分代码为:

private DelegateCommand getDataCommand; 
        
public ProductPhotosCollection() 
        

            getDataCommand 
= new DelegateCommand(delegate() { GetData(); }); 
        }
 
        
public DelegateCommand GetDataCommand get return getDataCommand; } } 

 
 

其中DelegateCommand 是实现ICommand 的类,代码如下:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Input; 
  
namespace AWDataSource 

    
public sealed class DelegateCommand : ICommand 
    

        
public delegate void SimpleEventHandler(); 
  
        
private SimpleEventHandler handler; 
  
        
private bool isEnabled = true
  
        
public DelegateCommand(SimpleEventHandler handler) 
        

            
this.handler = handler; 
        }
 
  
        
ICommand implementation 
  
        
public bool IsEnabled 
        

            
get return this.isEnabled; } 
            
set 
            

                
this.isEnabled = value; 
                
this.OnCanExecuteChanged(); 
            }
 
        }
 
  
        
private void OnCanExecuteChanged() 
        

            
if (this.CanExecuteChanged != null
            

                
this.CanExecuteChanged(this, EventArgs.Empty); 
            }
 
        }
 
    }
 
}