Привязка к списку - задержана одним источником

Привет. Я пытаюсь поддерживать модель MVVM, но где-то спотыкаюсь при попытке привязаться к списку. При первом запуске приложения я установил ItemCatalog (ObservableCollection) как определенный список ObservableCollection. Список пуст, но если я попробую еще раз, он сработает. Однако существует задержка между источником данных и отображаемыми данными. Например,

Я загружаю приложение -> устанавливаю источник на X -> Список пуст

Теперь я установил источник на Y -> в списке отображается X

Я установил источник на Z -> Listbox отображает Y и т.д..

Для меня это означает, что привязка работает, но я не могу понять, почему она отстает на единицу.

Мой XAML выглядит так:

<ListBox ItemsSource="{Binding ItemCatalog}">
       <DataTemplate>
             <StackPanel Margin="0,0,0,17" Width="432">
                  <TextBlock Text="{Binding Ref}" TextWrapping="Wrap"  Foreground="Black" />
                  <TextBlock Text="{Binding ItemName}" TextWrapping="Wrap" Margin="12,-6,12,0" Foreground="Black" />
             </StackPanel>
       </DataTemplate>
</ListBox>

В ViewModel значение ItemCatalog зависит от того, какую кнопку нажал пользователь (X,Y,Z), которые хранятся в статической переменной. Есть ли причина задержки или способ заставить его повторно привязаться к последнему значению ItemCatalog?

Если я удаляю привязку из XAML и устанавливаю источник списка прямо из кода программной части, он работает отлично. Однако я хочу попытаться сохранить код XAML. Я новичок в MVVM, поэтому, возможно, я делаю это неправильно. Благодарность

РЕДАКТИРОВАТЬ - дополнительный код

Код изменен в методе OnNavigatedTo

        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {


            if (NavigationContext.QueryString["Category"].ToString() == "House")
            {
                _categoryType = Models.House;

            }
            if (NavigationContext.QueryString["Category"].ToString() == "Car")
            {
                _categoryType = Models.Car;

            }

            MyViewModel.LoadNewData(_categoryType);


            base.OnNavigatedTo(e);
        }

LoadNewData просто устанавливает статическую переменную на основе переданного параметра.

   ItemCatalog = App.CarCatalog;

По сути, мне нужно выполнить повторную привязку после загрузки страницы через XAML.


person XSL    schedule 01.10.2010    source источник


Ответы (2)


Наверняка (поскольку на самом деле все еще недостаточно кода для продолжения) ваша ViewModel вызывает изменение свойства еще до того, как поле, поддерживающее ItemCatalog, фактически назначается. Что-то типа:-

 ObservableCollection<Stuff> _ItemCatalog;
 ObservableCollection<Stuff> ItemCatalog 
 {

    get { retutn _ItemCatalog; }
    set
    {
       PropertyChanged("ItemCatalog");
       _ItemCatalog = value;
    }
 }

Это может привести к описанному вами поведению.

person AnthonyWJones    schedule 01.10.2010
comment
Это отличный снимок в темноте! :D Я переместил метод NotifyPropertyChange и в представлении поместил DataContext в событие PropertChanged ViewModel. Я думал, что DataContext нужно будет установить только один раз, но, похоже, мне приходилось устанавливать его каждый раз, когда возникает событие PropertyChange. Спасибо! - person XSL; 02.10.2010

Вы не показываете никакого кода, где вы меняете источник с X на y, но я бы предположил из объясненного поведения, что привязка данных к вашему представлению интерпретируется до того, как это изменение произойдет.

person Roadie57    schedule 01.10.2010
comment
Является ли ItemCatalog ObservableCollection? - person Roadie57; 02.10.2010
comment
Мне удалось это решить (проверьте принятый ответ), но да, ItemCatalog - это ObservableCollection. - person XSL; 02.10.2010