Обязательная наблюдаемая коллекция в XAML в Windows Phone - PullRequest
0 голосов
/ 10 марта 2011

У меня проблемы с декларативной настройкой ItemsSource объекта ListBox, содержащегося в PivotItem, на простой странице Windows Phone 7.Я могу успешно установить 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 Ошибка: Невозможно получить значение «Категории» (тип «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);Целевым элементом является 'System.Windows.Controls.ListBox' (Name = 'CategoriesListBox');Свойство target - «ItemsSource» (тип «System.Collections.IEnumerable»). System.MethodAccessException: попытка доступа к методу не удалась: BTT.PinPointTime.WinPhone.Database.get_Categories () в System.Reflection.RuntimeMethodInfo.InternalInvoke (Objectobj, BindingFlags invokeAttr

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Я обнаружил, что проблема связана с уровнем доступа моего класса базы данных. Когда я изменил его с «запечатанный» на «общедоступный», привязка данных сработала.

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 голос
/ 20 января 2012

Хм. Я вижу, что вы реализуете INotifyPropertyChanged, но не используете его. Вы должны добавить NotifyPropertyChanged("Categories"); в get следующим образом:

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

если вы хотите добавить данные в коллекцию категорий, используйте свойство, а не участника. это сработало в моем коде, надеюсь, это поможет.

0 голосов
/ 10 марта 2011

Попробуйте создать экземпляр Categories в вашем коде конструктора.

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

Теперь ваша привязка будет правильно знать коллекцию.

...