2010-05-27 3 views
2

Так у меня есть ListBox:MVVM - ListBox SelectedItem Связывание недвижимости Going Null

<ListBox x:Name="listbox" HorizontalAlignment="Left" Margin="8,8,0,8" Width="272" BorderBrush="{x:Null}" Background="{x:Null}" Foreground="{x:Null}" ItemsSource="{Binding MenuItems}" ItemTemplate="{DynamicResource MenuItemsTemplate}" SelectionChanged="ListBox_SelectionChanged" SelectedItem="{Binding SelectedItem}"> 

</ListBox> 

и у меня это включено в мой ViewModel:

public ObservableCollection<MenuItem> MenuItems 
    { 
     get 
     { 
      return menuitems; 
     } 
     set 
     { 
      menuitems = value; 
      NotifyPropertyChanged("MenuItems"); 
     } 
    } 
    public MenuItem SelectedItem 
    { 
     get 
     { 
      return selecteditem; 
     } 
     set 
     { 
      selecteditem = value; 
      NotifyPropertyChanged("SelectedItem"); 
     } 
    } 

, а также в моем ViewModel:

public void UpdateStyle() 
    { 
     ActiveHighlight = SelectedItem.HighlightColor; 
     ActiveShadow = SelectedItem.ShadowColor; 
    } 

Итак, цель состоит в том, чтобы вызвать UpdateStyle() всякий раз, когда выбрано выбранное событие. Поэтому в файле .CS я вызываю UpdateStyle(). Проблема заключается в том, что всякий раз, когда я вхожу в метод eventchanged, мой ViewModel.SelectedItem всегда имеет значение null. Я попытался отладить это, чтобы убедиться, что привязка работает правильно, и это так. Когда я нажимаю на элемент в списке, запускается Set SelectedItem, устанавливая значение ... но где-то между ними и выбранным измененным (в файле CS). Сбрасывается в Null.

Может ли кто-нибудь помочь?

Благодаря

Edit: Я думал, что я мог бы пролить немного больше света. 1. Нажмите на элемент в списке 2. SelectedItem.Set запускается, ViewModel.SeletedItem устанавливается правильно. 3. Введите событие OnSelectionChanged в файле .CS. 4. Введите ViewModel.UpdateStyle() 5. SelectedItem выбрасывает ненужное исключение.

+0

Аналогичный вопрос был задан до того, как это поможет вам. http://stackoverflow.com/questions/414074/twoway-manual-binding-implementation-for-listbox-selecteditems – jsmith

ответ

2

Ого, нашел странный вопрос:

<Grid x:Name="LayoutRoot" DataContext="{Binding Source={StaticResource MainViewModelDataSource}}" d:DataContext="{d:DesignData /SampleData/MainViewModelSampleData.xaml}"> 

Этот код генерируется Expression Blend - и это вызывает проблему. Я удалил все сгенерированное связывание и просто создал this.datacontext новую виртуальную машину в конструкторе XAML ... теперь его работа.

Спасибо в любом случае, ребята.

+0

Этот код предназначен для предоставления выборочных данных только в режиме разработки. Это очень удобно. Я знаю, потому что я удалил его, чтобы что-то исправить, а потом понял, что это было и что произошло. Должен быть код в коде, который устанавливает контекст данных для среды выполнения. –

0

Посмотрите, будет ли ваше свойство backing (selecteditem) установлено в NULL где-нибудь в вашем коде.

+0

Nope - единственное место SelectedItem используется в UpdateStyle и Binding. – Peanut

+0

Я имею в виду нижний регистр selecteditem, где это устанавливается, это не то же самое, что SelectedItem. – Zamboni

Смежные вопросы