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

推荐订阅源

罗磊的独立博客
小众软件
小众软件
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
T
Threat Research - Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
Hacker News: Ask HN
Hacker News: Ask HN
Application and Cybersecurity Blog
Application and Cybersecurity Blog
I
Intezer
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
Scott Helme
Scott Helme
MyScale Blog
MyScale Blog
B
Blog
The Last Watchdog
The Last Watchdog
The Cloudflare Blog
U
Unit 42
Last Week in AI
Last Week in AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Tor Project blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Tailwind CSS Blog
Project Zero
Project Zero
P
Palo Alto Networks Blog
V
Vulnerabilities – Threatpost
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
C
Cisco Blogs
G
Google Developers Blog
A
About on SuperTechFans
博客园 - Franky
博客园 - 聂微东
Help Net Security
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
Recent Commits to openclaw:main
Recent Commits to openclaw:main
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
Docker
N
Netflix TechBlog - Medium
V2EX - 技术
V2EX - 技术
Cyberwarzone
Cyberwarzone
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
PCI Perspectives
PCI Perspectives
W
WeLiveSecurity
Engineering at Meta
Engineering at Meta
C
Check Point Blog
量子位

博客园 - 圣炎¢天乐

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); 
            }
 
        }
 
    }
 
}