2015-03-03 1 views
0

J'essaie de lier une liste d'objets à un DataGrid sur l'infrastructure compacte. Voilà ce que j'ai:Liste de liaison de l'objet à DataGrid

public class Order 
{ 
    //Other stuff 
    public Customer Customer 
    { 
     get { return _customer; } 
    } 
} 

public class Customer 
{ 
    //Other stuff 
    public string Address 
    { 
     get { return _address; } 
    } 
} 

Maintenant, je veux lier le DataGrid à une liste de l'ordre et afficher les propriétés que certains (l'adresse du client est l'un d'entre eux):

List<Order> orders = MethodThatGetsOrders(); 
datagrid.DataSource = orders; 
datagrid.TableStyles.Clear(); 
DataGridTableStyle ts = new DataGridTableStyle(); 
ts.MappingName = orders.GetType().Name; //This works OK 
DataGridTextBoxColumn tb = new DataGridTextBoxColumn(); 
tb.MappingName = orders.GetType().GetProperty("Customer").GetType().GetProperty("Address").Name; //Throws NullRef 
ts.GridColumnStyles.Add(tb); 
datagrid.TableStyles.Add(ts); 

Comment puis-je afficher l'adresse du client sur le DataGridTextBoxColumn?
Merci

Répondre

2

Je forme un viewmodel (ou mieux un adaptateur) avant d'avoir à mess avec fixations et obtenir un modèle plat, vous pouvez lier facilement à:

public class OrderViewModel 
{ 
    private Order _order; 

    public string Address 
    { 
     get { return _order.Customer.Address; } 
    } 

    // similar with other properties 

    public OrderViewModel(Order order) 
    { 
     _order = order; 
    } 
} 

Pour générer le ViewModelList faire:

List<OrderViewModel> viewModels = yourList.Select(m=> new OrderViewModel(m)).ToList(); 

Et pour lier simplement:

YourGridView.Datasource = new BindingSource(viewModels, null); 
+0

référence: http://www.dofactory.com/net/adapter-design-pattern –

+0

Thx pour l'entrée, je devrais faire une autre classe pour cela. Est-il un moyen d'associer la propriété Address à la TextBoxColumn MappingName? –

+1

Bien sûr il y a un moyen cependant si vous écrivez cet adaptateur vous pouvez lier automatiquement ... peut-être même en utilisant 2 INotifyPropertyChanged ... c'est bien plus facile ... La classe ne délègue ses appels qu'à la référence transmise par le constructeur donc ça ne consomme pas beaucoup de mémoire si c'est ce que tu as peur. –