In this blog post, we are going to demonstrate how to use a new XPObservableAssociationList<T> class in the DevExpress.Xpo.Linq library for data binding to persistent classes in WPF.
First, we will create a new WPF Application project. Then, we will add references to the DevExpress.Data, DevExpress.Xpo and DevExpress.Xpo.Linq assemblies. Then, we will add a base persistent BaseObject and a couple of persistent classes Person and Order as follows:
1: using DevExpress.Xpo;
2: using DevExpress.Xpo.DB;
3: using DevExpress.Xpo.Helpers;
4: …
5: [NonPersistent]
6: public class BaseObject : PersistentBase {
7: int oid;
8: [Key(true)]
9: public int Oid {
10: get { return oid; }
11: set { SetPropertyValue<int>("Oid", ref oid, value); }
12: }
13: protected override IList<T> CreateAssociationList<T>(DevExpress.Xpo.Metadata.XPMemberInfo property) {
14: return new XPObservableAssociationList<T>(Session, this, property);
15: }
16: public BaseObject(Session session)
17: : base(session) {
18: }
19: }
20: public class Person : BaseObject {
21: string firstName;
22: public string FirstName {
23: get { return firstName; }
24: set { SetPropertyValue<string>("FirstName", ref firstName, value); }
25: }
26: string lastName;
27: public string LastName {
28: get { return lastName; }
29: set { SetPropertyValue<string>("LastName", ref lastName, value); }
30: }
31: int age;
32: public int Age {
33: get { return age; }
34: set { SetPropertyValue<int>("Age", ref age, value); }
35: }
36: [Association("Person-Orders")]
37: public IList<Order> Orders {
38: get { return GetList<Order>("Orders"); }
39: }
40: public Person(Session sesson) : base(sesson) { }
41: }
42: public class Order : BaseObject {
43: DateTime orderDate;
44: public DateTime OrderDate {
45: get { return orderDate; }
46: set { SetPropertyValue<DateTime>("OrderDate", ref orderDate, value); }
47: }
48: Person employee;
49: [Association("Person-Orders")]
50: public Person Employee {
51: get { return employee; }
52: set { SetPropertyValue<Person>("Employee", ref employee, value); }
53: }
54: public Order(Session session) : base(session) { }
55: public override string ToString() {
56: return string.Format("Order - {0};", OrderDate);
57: }
58: }
59:
Now, let’s drop the ListBox (listBox1) and Button (button1) components onto the form and handle the Click event for button1. Additionally, we will modify the form’s code as follows:
1: using DevExpress.Xpo;
2: using DevExpress.Xpo.DB;
3: using DevExpress.Xpo.Helpers;
4: ...
5: public partial class Window1 : Window {
6: UnitOfWork uowCommon;
7: Person personToBind;
8: public Window1() {
9: InitializeComponent();
10: XpoDefault.DataLayer = new SimpleDataLayer(
11: new InMemoryDataStore(AutoCreateOption.DatabaseAndSchema)
12: );
13: XpoDefault.Session = null;
14: PrepareObjects();
15: uowCommon = new UnitOfWork();
16: personToBind = uowCommon.FindObject<Person>(null);
17: if(personToBind != null){
18: listBox1.ItemsSource = personToBind.Orders;
19: }
20: }
21: private void button1_Click(object sender, RoutedEventArgs e) {
22: if(personToBind != null && personToBind.Orders.Count > 0){
23: personToBind.Orders[0].Employee = null;
24: }
25: }
26: void PrepareObjects() {
27: using (UnitOfWork uow = new UnitOfWork()) {
28: Person p = new Person(uow);
29: p.FirstName = "Jhon";
30: p.LastName = "Smith";
31: p.Age = 25;
32: DateTime now = DateTime.Now;
33: for (int i = 0; i < 10; i++) {
34: Order o = new Order(uow);
35: o.Employee = p;
36: o.OrderDate = now.AddDays(i).AddSeconds(i * 12312);
37: }
38: uow.CommitChanges();
39: }
40: }
41: }
42:
Now we are done. If we run the application, we will see the following results:
Happy XPOing!
Free DevExpress Products – Get Your Copy Today
The following free DevExpress product offers remain available. Should you have any questions about the free offers below, please submit a ticket via the
DevExpress Support Center at your convenience. We’ll be happy to follow-up.