Silverlight - не удается привязать ListBox к моей коллекции ObservableCollection - PullRequest
0 голосов
/ 19 июля 2010

Я пытаюсь создать 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 есть все мои пользователи.

1 Ответ

5 голосов
/ 19 июля 2010

Вам не хватает части {Binding} из вашего Источника Предметов.

<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"));
        }
    }

}
...