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

浙公网安备 33010602011771号