在Windows Phone中绑定XAML中的Observable Collection

时间:2011-03-09 23:48:12

标签: xaml data-binding windows-phone-7 observablecollection

我在一个简单的Windows Phone 7页面中以声明方式设置PivotItem中包含的ListBox的ItemsSource时遇到问题。我可以在代码中成功设置ItemsSource。

这是包含我要绑定到的ObservableCollection的类的片段:

sealed class Database : INotifyPropertyChanged
{
    //Declare Instance
    private static readonly Database instance = new Database();

    //Private Constructor
    private Database() { }

    //The entry point into this Database
    public static Database Instance
    {
        get
        {
            return instance;
        }
    }

    #region Collections corresponding with database tables

    public ObservableCollection<Category> Categories { get; set; }
    public ObservableCollection<CategoryType> CategoryTypes { get; set; }

以下是我的XAML示例:

<ListBox x:Name="CategoriesListBox" Margin="0,0,-12,0" ItemsSource="{Binding Categories}" DisplayMemberPath="Name" />

在我的页面中,我尝试按如下方式设置数据上下文:

this.DataContext = Database.Instance;

然而,除非我在代码中显式设置ItemsSource,否则绑定不起作用,如下所示:

CategoriesListBox.ItemsSource = Database.Instance.Categories;

我知道我应该能够以声明方式完成所有操作,但是我已经尝试了许多不同的方式来声明性地设置ItemsSource(除了我上面详述的内容)并且没有工作。

有人能帮助我吗?

更多信息:运行时的输出窗口显示以下内容:System.Windows.Data错误:无法获取'Categories'值(类型'System.Collections.ObjectModel.ObservableCollection`1 [BTT.PinPointTime.Entities.Category]' )来自'BTT.PinPointTime.WinPhone.Database'(输入'BTT.PinPointTime.WinPhone.Database')。 BindingExpression:Path ='Categories'DataItem ='BTT.PinPointTime.WinPhone.Database'(HashCode = 99825759); target元素是'System.Windows.Controls.ListBox'(Name ='CategoriesListBox'); target属性是'ItemsSource'(类型'System.Collections.IEnumerable').. System.MethodAccessException:尝试访问该方法失败:BTT.PinPointTime.WinPhone.Database.get_Categories()    在System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj,BindingFlags invokeAttr

3 个答案:

答案 0 :(得分:2)

我发现问题与我的数据库类的访问级别有关。当我将其从“密封”更改为“公密”时,数据绑定工作正常。

public sealed class Database : INotifyPropertyChanged
{
    //Declare Instance
    private static readonly Database instance = new Database();

    //Private Constructor
    private Database() 
    {
        //Categories = new ObservableCollection<Category>();
    }

   //more code here....

答案 1 :(得分:1)

嗯,我看到你正在实施INotifyPropertyChanged,但没有使用它。您应该像这样添加NotifyPropertyChanged("Categories");

private ObservableCollection<Category> _categories
public ObservableCollection<Category> Categories { 
  get{return _categories;}
  set
  {
    if (_categories == value) return;
    _categories= value;                             
     NotifyPropertyChanged("Categories");
   }
}

如果要将数据添加到类别集合,请使用属性而不是成员。它在我的代码中起作用,希望这会有所帮助。

答案 2 :(得分:0)

尝试在构造函数代码中实例化类别。

private Database() 
{
   Categories =  new ObservableCollection<Category>();
}

现在你的绑定将正确地知道集合。