2009-04-29 9 views
1

Я пытаюсь привязать свое представление к моей модели просмотра без DataObjectProvider.Почему этот вид не имеет обязательной привязки к этой ViewModel?

следующий код работает без ошибок, но мой ListBox является пустым.

Насколько я могу сказать, я правильно:

  • установите свойство DataContext к самому ViewModel (DataContext = new CustomersViewModel();)
  • выставить объекты заказчика в ViewModel (public static ObservableCollection<Customer> GetAll())
  • Свяжите ListBox к объектам заказчика (ItemsSource="{Binding GetAll}")

Какая небольшая часть синтаксиса я пропускаю Вот?

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: (модель)

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

Пробовали ли вы положить точку останова в методе Customer.GetAll(), чтобы увидеть, если он вызывался? –

ответ

2

Проблема заключается в том, что вы пытаетесь связать с CustomerViewModel.GetAll(), когда GetAll в CustomerViewModel является статической функцией, а не свойством экземпляра.

Изменение статической функции на что-то вроде этого (в CustomerViewModel):

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

Точно, спасибо! –

+0

Возможно, вы захотите создать объект singleton для хранения всех объектов клиента в Customer ... если GetAll читается более одного раза, он будет возвращать новую коллекцию клиентов при каждом вызове. Другим вариантом было бы получить Клиентов один раз и сохранить их. Затем вы можете вернуть этих клиентов из свойства GetAll. –

2

Проблема заключается в том, что CustomersViewModel .GetAll() является статическим методом. Связывание работает только с свойствами экземпляра. Вы должны перенести реализацию GetAll() в конструктор, а затем выставить коллекцию как свойство экземпляра класса.

 Смежные вопросы

  • Нет связанных вопросов^_^