DomainDataSource学习笔记

(一)问题的提出 : 

        在很多情况下,使用DomainDataSource比使用DomainContext对于数据获取要方便得多!就拿我前篇DataForm中的ComboBox下篇中就用到了DomainDataSource.只需要在前台的*.xaml中写上一句话ItemsSource="{Binding Path=Data,ElementName=employeeDomainDataSource}"就行了。本篇不着重讲解到底怎么方便,而是如果我们这句不写,而在后台代码中实现这个功能,该怎么实现?

(二)分析 :

在解决这个问题我们必须搞清楚整个代码的执行顺序!经过测试发现执行流程如下:

(1)DepartmentDDS获取了Department中的所有值-->触发departmentDomainDataSource_LoadedData事件。
(2)employeeDomainDataSource获取了Employee中的所有值-->触发employeeDomainDataSource_LoadedData事件这,我们在该事件中获取就很方便了。
(3)进行每个Employee绑定,EmployeeID、EmployeeName、而到了部门DepartmentID时执行转换器DepartmentConvert.实现DepartmentID=>Department,这样Combobox的SelectedItem就先中了DepartmentID所对应的Department了。

(三)延伸:

用DomainDataSource进行的数据绑定很容,但是有时我们需要实现特殊的操作还是会用到DomainContext,要实现Combobox根据DepartmentID=>Department,还得把var query = from employee in client.GetEmployeesQuery().Where(p => p.EmployeeID == 1) select employee方在这里!放在其他的地方是不会实现该功能的。

(四)后台代码:

 

代码
namespace ComboxInDataForm
{
public partial class MainPage : UserControl
{
EmployeeContext client
= new EmployeeContext();
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
this.dataForm1.EditTemplate = Resources["employeeTemplate"] as DataTemplate;
//var query = from employee in client.GetEmployeesQuery().Where(p => p.EmployeeID == 1) select employee;
//LoadOperation<Employee> lo = client.Load(query);
//lo.Completed += new EventHandler(lo_Completed);
}

private void departmentDomainDataSource_LoadedData(object sender, System.Windows.Controls.LoadedDataEventArgs e)
{
if (e.HasError)
{
System.Windows.MessageBox.Show(e.Error.ToString(),
"Load Error", System.Windows.MessageBoxButton.OK);
e.MarkErrorAsHandled();
}
}

private void employeeDomainDataSource_LoadedData(object sender, LoadedDataEventArgs e)
{
if (e.HasError)
{
System.Windows.MessageBox.Show(e.Error.ToString(),
"Load Error", System.Windows.MessageBoxButton.OK);
e.MarkErrorAsHandled();
}
//方法一:用DomainDataSource实现Combobox功能
//this.dataForm1.CurrentItem = employeeDomainDataSource.Data.Cast<Employee>().Where(p => p.EmployeeID ==3).FirstOrDefault();
//方法二:使用DomainContext实现Combobox功能
var query = from employee in client.GetEmployeesQuery().Where(p => p.EmployeeID == 1) select employee;
LoadOperation
<Employee> lo = client.Load(query);
lo.Completed
+= new EventHandler(lo_Completed);
}
void lo_Completed(object sender, EventArgs e)
{
LoadOperation
<Employee> lo = sender as LoadOperation<Employee>;
if (!lo.HasError)
{
if (lo.Entities.Count() > 0)
{
this.dataForm1.CurrentItem = lo.Entities.FirstOrDefault();
}
}
else
{
MessageBox.Show(lo.Error.Message);
}

}

}
}

 代码下载

 

 

 

 

posted @ 2010-12-02 12:45  焦涛  阅读(506)  评论(0)    收藏  举报