我在一个简单的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
答案 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>();
}
现在你的绑定将正确地知道集合。