2009-04-29 11 views
1

Ich versuche, meine Ansicht an mein Ansichtsmodell ohne DataObjectProvider zu binden.Warum ist diese Ansicht nicht korrekt an dieses ViewModel gebunden?

Der folgende Code läuft ohne Fehler, aber meine ListBox ist leer.

Soweit ich sagen kann, ich richtig:

  • die Anzeige für den Datacontext auf das Ansichtsmodell setzte sich (DataContext = new CustomersViewModel();)
  • die Kundenobjekte in dem Viewmodel (public static ObservableCollection<Customer> GetAll()) die ListBox
  • binden aussetzen zu den Kundenobjekten()

Welches kleine Stück Syntax fehlt mir Hier?

CustomersView.xaml:

<UserControl x:Class="TestDynamicForm123.View.CustomersView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <UserControl.Resources> 
     <Style x:Key="allCustomersListBox" TargetType="ListBox"> 
      <Setter Property="BorderThickness" Value="0"/> 
     </Style> 
     <DataTemplate x:Key="allCustomersDataTemplate"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding FirstName}"/> 
       <TextBlock Text=" "/> 
       <TextBlock Text="{Binding LastName}"/> 
      </StackPanel> 
     </DataTemplate> 
    </UserControl.Resources> 

    <StackPanel Style="{StaticResource viewWrappingStackPanel}"> 
     <ListBox ItemsSource="{Binding GetAll}" 
       ItemTemplate="{StaticResource allCustomersDataTemplate}" 
       Style="{StaticResource allCustomersListBox}"> 
     </ListBox> 
    </StackPanel> 
</UserControl> 

CustomersView.xaml.cs:

using System.Windows.Controls; 
using TestDynamicForm123.ViewModel; 

namespace TestDynamicForm123.View 
{ 
    public partial class CustomersView : UserControl 
    { 
     public CustomersView() 
     { 
      InitializeComponent(); 

      DataContext = new CustomersViewModel(); 
     } 
    } 
} 

CustomersViewModel.cs:

using System.Collections.ObjectModel; 

namespace TestDynamicForm123.ViewModel 
{ 
    public class CustomersViewModel 
    { 
     public static ObservableCollection<Customer> GetAll() 
     { 
      return Customer.GetAll(); 
     } 
    } 
} 

customer.cs: (Modell)

using System.Collections.ObjectModel; 

namespace TestDynamicForm123.ViewModel 
{ 
    public class Customer 
    { 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int Age { get; set; } 

     public static ObservableCollection<Customer> GetAll() 
     { 
      ObservableCollection<Customer> customers = new ObservableCollection<Customer>(); 
      customers.Add(new Customer() { FirstName = "Jay", LastName = "Anders", Age = 34 }); 
      customers.Add(new Customer() { FirstName = "Jim", LastName = "Smith", Age = 23 }); 
      customers.Add(new Customer() { FirstName = "John", LastName = "Jones", Age = 22 }); 
      customers.Add(new Customer() { FirstName = "Sue", LastName = "Anders", Age = 21 }); 
      customers.Add(new Customer() { FirstName = "Chet", LastName = "Rogers", Age = 35 }); 
      customers.Add(new Customer() { FirstName = "James", LastName = "Anders", Age = 37 }); 
      return customers; 
     } 

    } 
} 
+0

Haben Sie versucht, einen Haltepunkt in der Customer.GetAll() Methode setzen, um zu sehen, wenn sie aufgerufen wird immer? –

Antwort

2

Das Problem besteht darin, dass Sie versuchen, an CustomerViewModel.GetAll() zu binden, wenn GetAll in CustomerViewModel eine statische Funktion nicht eine Instanzeigenschaft ist.

ändern Sie die statische Funktion zu so etwas wie diese (in CustomerViewModel):

public ObservableCollection<Customer> GetAll 
{ 
    get { return Customer.GetAll(); } 
} 
+0

Genau, danke! –

+0

Möglicherweise möchten Sie ein Singleton-Objekt erstellen, um alle Kundenobjekte in Customer zu speichern. Wenn GetAll mehr als einmal gelesen wird, wird bei jedem Aufruf eine neue Kundensammlung zurückgegeben. Eine andere Möglichkeit wäre, die Kunden einmal zu bekommen und sie zu speichern. Sie können diese Kunden dann aus der GetAll-Eigenschaft zurückgeben. –

2

Das Problem ist, dass CustomersViewModel .GetAll() eine statische Methode ist. Die Bindung funktioniert nur mit Instanzeigenschaften. Sie sollten die Implementierung von GetAll() in den Konstruktor verschieben und dann die Auflistung als Instanzeigenschaft der Klasse verfügbar machen.