在Windows Phone中绑定XAML中的可观察集合

在Windows Phone中绑定XAML中的可观察集合,xaml,data-binding,windows-phone-7,observablecollection,Xaml,Data Binding,Windows Phone 7,Observablecollection,在简单的Windows Phone 7页面中,以声明方式设置数据透视项中包含的列表框的ItemsSource时遇到问题。我可以在代码隐藏中成功设置ItemsSource 下面是包含我要绑定到的ObservableCollection的类的一个片段: sealed class Database : INotifyPropertyChanged { //Declare Instance private static readonly Database instance = new D

在简单的Windows Phone 7页面中,以声明方式设置数据透视项中包含的列表框的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; }
但是,除非我在代码中显式设置ItemsSource,否则绑定无法工作,如下所示:

this.DataContext = Database.Instance;
CategoriesListBox.ItemsSource = Database.Instance.Categories;
我知道我应该能够以声明的方式完成这一切,但是我尝试了许多不同的方式以声明的方式设置ItemsSource(除了我上面详细介绍的内容之外),但都没有效果

有人能帮我吗

进一步信息:运行时的输出窗口显示以下内容:System.windows.Data错误:无法从“BTT.PimpointTime.WinPhone.Database”(类型“BTT.PimpointTime.WinPhone.Database”)获取“Categories”值(类型“System.Collections.ObjectModel.ObservableCollection”“1[BTT.PimpointTime.Entities.Category]”)。BindingExpression:Path='Categories'DataItem='BTT.PinPointTime.WinPhone.Database'(HashCode=99825759);目标元素是'System.Windows.Controls.ListBox'(Name='classifieslistbox');目标属性是'ItemsSource'(类型'System.Collections.IEnumerable')。。System.MethodAccessException:尝试访问方法失败:BTT.PinPointTime.WinPhone.Database.get_Categories()
在System.Reflection.RuntimeMethodInfo.InternalInvoke(对象obj,BindingFlags invokeAttr)尝试实例化构造函数代码中的类别

private Database() 
{
   Categories =  new ObservableCollection<Category>();
}
private数据库()
{
类别=新的ObservableCollection();
}

现在,您的绑定将正确地了解集合。

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

private Database() 
{
   Categories =  new ObservableCollection<Category>();
}
private数据库()
{
类别=新的ObservableCollection();
}

现在,您的绑定将正确地了解集合。

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

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....
公共密封类数据库:INotifyPropertyChanged
{
//声明实例
私有静态只读数据库实例=新数据库();
//私有构造函数
专用数据库()
{
//类别=新的ObservableCollection();
}
//更多代码在这里。。。。

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

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....
公共密封类数据库:INotifyPropertyChanged
{
//声明实例
私有静态只读数据库实例=新数据库();
//私有构造函数
专用数据库()
{
//类别=新的ObservableCollection();
}
//更多代码在这里。。。。

Hmm我看到您正在实现
INotifyPropertyChanged
,但没有使用它。您应该在get like so中添加
NotifyPropertyChanged(“类别”);

private ObservableCollection<Category> _categories
public ObservableCollection<Category> Categories { 
  get{return _categories;}
  set
  {
    if (_categories == value) return;
    _categories= value;                             
     NotifyPropertyChanged("Categories");
   }
}
private observedcollection\u类别
公共可观测集合类别{
获取{return\u categories;}
设置
{
if(_categories==value)返回;
_类别=价值;
通知财产变更(“类别”);
}
}

当您想向类别集合添加数据时,请使用属性而不是成员。它在我的代码中起作用,希望这能有所帮助。

Hmm我看到您正在实现
INotifyPropertyChanged
,但没有使用它。您应该在get like so中添加
NotifyPropertyChanged(“Categories”);

private ObservableCollection<Category> _categories
public ObservableCollection<Category> Categories { 
  get{return _categories;}
  set
  {
    if (_categories == value) return;
    _categories= value;                             
     NotifyPropertyChanged("Categories");
   }
}
private observedcollection\u类别
公共可观测集合类别{
获取{return\u categories;}
设置
{
if(_categories==value)返回;
_类别=价值;
通知财产变更(“类别”);
}
}

当您要向类别集合添加数据时,请使用属性而不是成员。它在我的代码中起作用,希望这有帮助。

当您说“绑定不起作用”时,你是什么意思?你什么都没有?你有异常吗?调试输出窗口中有任何消息吗?@madd0我没有异常,但是输出窗口确实显示了一些细节-当你说“绑定不工作”时,已将其添加到我的帖子中,你的意思是什么?你什么都没有?你有异常吗?调试输出窗口中有任何消息吗?@madd0我没有异常,但是输出窗口确实显示了一些细节-已将其添加到我的帖子中,但不起作用,但是我在运行时从输出窗口添加了一些额外的信息,这些信息可能有助于解决不起作用的问题,h不过,我在运行时从输出窗口添加了一些额外的信息,这可能会有所帮助