2012-01-30 15 views
12

Tengo List<Object> donde el objeto tiene un montón de niño List<Object> alrededor de 4-6 niveles.La mejor manera de convertir Lista <Object> a ObservableCollection <Object>

Ahora tengo que obligar a éste a WPF TreeView ... :(

Qué la mejor manera para convertirlo en ObservableCollection<Object> es?

+1

¿Por qué no hacerlos 'ObservableCollection ' en primer lugar? Cuando trabaje con WPF, es importante obtener la capa de datos correcta, y si alguna vez muestra una lista que puede cambiar en la interfaz de usuario, siempre debe usar un 'ObservableCollection' en lugar de' List' – Rachel

+0

@Rachel Correct. El primer lugar es RIA Services. No sé si es posible hacerlo ... – Terminador

Respuesta

4

Una parte de la respuesta es usar extensiones reactivas (Rx). Puedes obtenerlo de NuGet y está desarrollado por Microsoft. Con la ayuda de ella se puede decir simplemente: myListCollection.ToObservable();

Si su hijo colecciones siempre están en un nodo con el mismo nombre se puede utilizar un while(item.Collection != null || item.Collection.Count == 0) y poner el ToObservable() dentro del bucle

+0

Esto es una exageración –

18

Suponiendo que quiere decir ObservableCollection<T>, si quería la List directamente ObservableCollection a la que está, en sólo tiene que utilizar el constructor:

var oc = new ObservableCollection<Object>(yourListOfObject); 

Ahora, si usted está queriendo descansar cada uno de ellos, lo que tendría que hacer algo de WOR k para colapsarlos en un solo ObservableCollection<T>.

+0

Si creé una clase pública llamada 'Computadora' y tengo una cadena pública' Nombre' getter-setter dentro de mi OC, y luego tengo una 'Lista lstComputers', me dice que 'no puedo convertir 'System.Collections.Generic.List ' en 'System.Collections.Generic.List ' '. – vapcguy

+0

En realidad descubrí cómo hacerlo. No puede haber tipos no coincidentes. – vapcguy

1

Supongo que estás hablando de ObservableCollection. Para responder, simplemente, se puede utilizar el ctor:

List<Object> myList = GetList(); 
new ObservableCollection<Object>(myList); 

Sin embargo, creo que hay algo de trabajo queda por hacer en cuanto a la organización de la información de forma jerárquica.

+0

¿Crees que funcionará para todos los niños Lista ? – Terminador

+1

La lista no es un uso común de los genéricos. Comience con una revisión de los genéricos aquí: http://stackoverflow.com/questions/155260/what-is-the-syntax-within-c-sharp –

+0

Además, aquí hay una buena publicación en el blog Acabo de buscar en Google que los detalles vinculantes jerárquica datos a un WPF TreeView: http://www.mattlong.com.au/?p=37 –

1

Qué quiere decir ObservableCollection? Si desea que el nivel Lists también sea observable, tendrá que atravesar el árbol y cambiar los elementos según sea necesario o agregar cada elemento por separado para comenzar.

3

suponiendo que tiene una clase de nodo definido de este modo:

public class Node 
{ 
    public ICollection<Node> Children { get; set; } 
} 

Puede utilizar la recursividad para convertir List<Node> colecciones, en cualquier nivel de profundidad:

public static ObservableCollection<Node> ToObservableRecursive(ICollection<Node> nodes) 
{ 
    foreach (Node node in nodes) 
     if (node.Children != null) 
      node.Children = ToObservableRecursive(node.Children); 

    return new ObservableCollection<Node>(nodes); 
} 
+0

¡Es muy útil! ¡Gracias! – Terminador

+0

Si creé una clase pública llamada 'Computer' y tengo una cadena pública' Name' getter-setter dentro de mi OC, y luego tengo una 'List lstComputers', me dice que' no puedo convertir 'de System. Collections.Generic.List 'a' System.Collections.Generic.List '' – vapcguy

+0

De hecho, descubrí cómo hacerlo. No puede haber tipos no coincidentes. – vapcguy

0

No se puede hacer ninguna de las soluciones ¡enumerados aquí hasta que tus tipos sean iguales! Si su lista o ICollection o IEnumerable es del tipo string, por ejemplo, pero su ObservableCollection necesita ser del tipo Nodes o Computers o algo más, ¡primero tiene que obtener la Lista en ese tipo! Perdí tanto tiempo en estas otras "soluciones" falsas y simplificadas que NO son soluciones porque no explican esto ni toman en cuenta este factor.

decir esto es su ObservableCollection:

public class Computer 
{ 
    public string Name { get; set; } 
} 

bastante estándar, ¿verdad? Probablemente termines reemplazando Computer con cualquier cantidad de cosas en cualquier cantidad de proyectos.

Si a continuación, obtener una lista de nombres de equipo en un List<string> llamada lstComputers, no se puede convertir sólo que usando:

var oc = new ObservableCollection<Computer>(lstComputers); 

Dirá sus tipos no coinciden y no se pueden convertir de una a la otra, porque Está tratando de meter un List<string> en un ObservableCollection<Computer>. Clavija cuadrada en un agujero redondo.

En cambio, en su función para obtener los nombres de los equipos, hay que añadir a todos ellos "especial similar":

public static List<Computer> NetworkComputers() 
{ 
    List<Computer> lstComputers = new List<Computer>(); 
    DirectoryEntry root = new DirectoryEntry("WinNT:"); 
    foreach (DirectoryEntry computers in root.Children) 
    { 
     foreach (DirectoryEntry computer in computers.Children) 
     { 
      if (computer.Name != "Schema" && computer.SchemaClassName == "Computer") 
      { 
       lstComputers.Add(new Computer() { Name = computer.Name }); 
      } 
     } 
    } 
} 

Sólo porque utilizamos esa línea lstComputers.Add(new Computer() { Name = computer.Name }); y devolver la List<Computer> y no List<string> puede ahora lo ponemos en nuestro ObservableCollection<Computer>.

Si se ha perdido el barco y no puede hacerlo de esta manera desde el principio, este tema habla de otras formas en las que podría ser capaz de hacer la conversión: convert a list of objects from one type to another using lambda expression

Así que una vez que lo tienes en un List<Computer> , solo entonces usted puede hacer:

List<Computer> lstComputers = NetworkComputers(); 
var oc = new ObservableCollection<Computer>(lstComputers); 
Cuestiones relacionadas