2011-01-13 16 views
7

Tengo una colección observable del tipo de proyecto, que quiero que se mostrará en un ListView, pero no se añade nada a mi ListView que realmente no entiendoConseguir un WPF ListView para mostrar ObservableCollection <T> usando enlace de datos

Mi MainWindow. xaml

  <ListView Name="ListViewProjects" Grid.Column="0" Grid.RowSpan="3" SelectionChanged="ListViewProjectsSelectionChanged" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" MinWidth="100"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <WrapPanel> 
         <TextBlock Text="{Binding Path=ProjectID}"/> 
         <TextBlock Text="{Binding Path=ProjectName}"/> 
        </WrapPanel> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

Mis MainWindow.cs

public partial class MainWindow : Window 
{ 
    ObservableCollection<Project> Projects = new ObservableCollection<Project>(); 
    ObservableCollection<Employee> Employees = new ObservableCollection<Employee>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = Projects; 

     Project pro1 = new Project(1, "Swordfish"); 
     Projects.Add(pro1); 
     Employee empMads = new Employee("Mads", 1); 
     Employee empBrian = new Employee("Brian", 2); 
     Employees.Add(empMads); 
     Employees.Add(empBrian); 
    } 

    private void ListViewProjectsSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
    } 
} 

y mis Project.cs que es el archivo de clase

[Serializable] 
class Project : INotifyPropertyChanged 
{ 
    public Project(int id, string name) 
    { 
     ID = id; 
     Name = name; 
    } 

    private int id; 
    public int ID 
    { 
     get { return id; } 
     set 
     { 
      id = value; 
      NotifyPropertyChanged("ProjectID"); 
     } 
    } 

    private string name; 
    public string Name 
    { 
     get { return name; } 
     set 
     { 
      name = value; 
      NotifyPropertyChanged("ProjectName"); 
     } 
    } 

    [field: NonSerialized] 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

Pero no se agrega nada a mi lista No puedo ver lo que me falta para que funcione.

lo tengo como un ObservableCollection hago DataContext = la colección y hago vinculante en el archivo XAML

Editar codepart 1:

 public ObservableCollection<Project> Projects { get; set; } 
    public ObservableCollection<Employee> Employees { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Projects = new ObservableCollection<Project>(); 
     Employees = new ObservableCollection<Employee>(); 

     DataContext = Projects; 
+0

¿Crees que podrías publicar cómo configuras tu DataContext? – Josh

Respuesta

3

Es porque se utiliza ruta de enlace como ProjectID mientras su clase Project tiene la propiedad ID. Lo mismo ocurre con las propiedades ProjectName y Name.

E: Cuando tiene problemas con la unión que es muy útil para mirar a través de Output pestaña en modo de depuración de Visual Studio para ver qué errores se volvió de enlace de datos del motor. Esas excepciones normalmente no se devuelven al usuario, pero puede inspeccionarlas allí.

+0

Eso funcionó, pero no puedo ver nada en mi salida o lista de errores cuando está escrito de la manera incorrecta. Por cierto ¿es posible tener un cuadro combinado que tengo en el mismo documento xaml databind a otra lista? – Mech0z

+0

System.Windows.Data Error: 40: Error de ruta BindingExpression: la propiedad 'ProjectID' no se encuentra en 'object' '' Project '(HashCode = 41717140)'. BindingExpression: Path = ProjectID; DataItem = 'Proyecto' (HashCode = 41717140); el elemento de destino es 'TextBlock' (Name = ''); la propiedad de destino es 'Texto' (escriba 'Cadena') - Este es el mensaje que encontré en la ventana de salida cuando comencé su código. Y sí, es posible cambiar la fuente de datos en tiempo de ejecución (supongo que esto es lo que estás pidiendo), pero aquí no tengo suficiente espacio. Estoy seguro de que puedes encontrar en la web cómo hacer esto. – Pako

+0

Utilizado porque no sabía que VS daría salida a los errores de enlace de datos. Eso va a reducir mucho mi tiempo de depuración XAML/WPF, ¡salud! – Psytronic

1

Por defecto, las variables de sus miembros serán privadas. Si lo que ha publicado aquí es su código real, entonces el XAML no tiene forma de acceder a él. Hace que esas propiedades sean públicas:

public ObservableCollection<Project> Projects = new ObservableCollection<Project>(); 
public ObservableCollection<Employee> Employees = new ObservableCollection<Employee>(); 
+0

Esos son campos públicos, no estoy seguro, pero tampoco creo que funcionen. –

+0

Los campos de instancia son privados por defecto. Si miras su código, omite cualquier modificador de alcance, lo que los hace privados. – Josh

+0

Quiero decir que lo que escribiste son campos públicos, las vinculaciones necesitan propiedades públicas por lo que yo sé. –

2

Como se señaló, hay algunos problemas aquí. Una de las "trampas" que se obtiene como un nuevo desarrollador de WPF es que no se puede utilizar variables miembro, usted tiene que utilizar las propiedades públicas:

public ObservableCollection<Project> Projects { get; set; } 
public ObservableCollection<Employee> Employees { get; set; } 

Estos, por supuesto, tienen que ser inicializado en su constructor .

Una vez hecho esto, debe asegurarse de que las propiedades de la colección coincidan con lo que está vinculando en ListView.

+0

Bueno, tal vez estoy equivocado, pero puedes usar el campo privado como datacontext (esto es lo que está haciendo Mech0z) y todo funciona bien. – Pako

0

1. Su lista debe ser una propiedad pública (Edit: a menos que establezca la DataContext igual que lo hizo ...) (public ObservableCollection<Project> Projects {get;})

2.Your notificación debe ser el mismo que el nombre real de la propiedad:

private int id; 
public int ID 
{ 
    get { return id; } 
    set 
    { 
     id = value; 
     NotifyPropertyChanged("ID"); 
    } 
} 

3.El necesidades unión sea de esa manera, así:

<TextBlock Text="{Binding Path=ID}"/> 

creo ...

+0

Si los hago propiedad como puede ver en mi "Edición de código 1" agregué a la pregunta principal y comento el Datacontext = Proyectos, entonces no se agrega nada, entonces necesito cambiar mi enlace en mi lista de mi lista, pero ¿qué debería hacer? ¿que sea? – Mech0z

+0

Si su ventana se llama MyWindow en Xaml, su enlace se puede hacer con ItemsSource = "{Binding ElementName = MyWindow, Path = Projects}" –

Cuestiones relacionadas