Silverlight - 无法将ListBox绑定到我的ObservableCollection

时间:2010-07-19 14:48:45

标签: c# silverlight binding listbox observablecollection

我正在尝试创建一个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);

我设置了一个对填充listOfUsers的WCF服务的调用:

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 个答案:

答案 0 :(得分:5)

你错过了那里的ItemsSource的{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(以及随之而来的开销)。

e.g。

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

}