2010-07-19 3 views
0

Я пытаюсь создать ListBox, который обновляет содержимое ObservableCollection всякий раз, когда что-либо в этой коллекции изменяется, поэтому это код, который я написал для этого:Silverlight - Не удается заставить ListBox привязываться к моему ObservableCollection

XAML:

<ListBox x:Name="UserListTest" Height="300" Width="200" ItemsSource="listOfUsers"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding LastName}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

C#:

public ObservableCollection<User> listOfUsers 
    { 
     get { return (ObservableCollection<User>)GetValue(listOfUsersProperty); } 
     set { SetValue(listOfUsersProperty, value); } 
    } 

    public static readonly DependencyProperty listOfUsersProperty = 
     DependencyProperty.Register("listOfUsers", typeof(ObservableCollection<User>), typeof(MainPage), null); 

И я создал вызов к службе WCF, которая заполняет listOfUsers:

void repoService_FindAllUsersCompleted(object sender, FindAllUsersCompletedEventArgs e) 
    { 
     this.listOfUsers = new ObservableCollection<User>(); 

     foreach (User u in e.Result) 
     { 
      listOfUsers.Add(u); 
     } 

     //Making sure it got populated 
     foreach (User u in listOfUsers) 
     { 
      MessageBox.Show(u.LastName); 
     } 
    } 

ListBox никогда не заполняется ничем. Я предполагаю, что моя проблема может быть связана с xaml, поскольку у ObservableCollection есть все мои пользователи.

ответ

5

Вам не хватает части {Binding} от вашего ItemsSource.

<ListBox x:Name="UserListTest" Height="300" Width="200" ItemsSource="{Binding listOfUsers}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding LastName}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Кроме того, вам не нужно иметь DependencyProperty для вашего списка, вы можете быть в состоянии добиться того, что вам нужно с собственностью на класс, который реализует INotifyPropertyChanged. Это может быть лучшим вариантом, если вам не требуется DependencyProperty (и накладные расходы, которые идут вместе с ним) по другой причине.

например.

public class MyViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<User> _listOfUsers; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public ObservableCollection<User> ListOfUsers 
    { 
     get { return _listOfUsers; } 
     set 
     { 
      if (_listOfUsers == value) return; 
      _listOfUsers = value; 
      if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ListOfUsers")); 
     } 
    } 

} 
+0

Ahh, конечно, я не могу поверить, что я этого не замечал. Спасибо! Теперь работать отлично – EPatton