2010-12-15 4 views
0

Я пытаюсь динамически переключать DataContext для моего приложения при изменении элемента Pivot. Все работает так, как я этого хочу, однако я продолжаю получать ошибки в окне вывода отладчика о том, что источники данных не найдены из списка ListBox, присутствующих внутри PivotItems, которые не выбраны в настоящее время PivotItem.Ошибка при обновлении DataContext для Windows Phone 7 Pivot

Например, скажем, у меня есть 2 PivotItems - PivotItem1 и PivotItem2 - каждый из них отображает один ListBox каждый - ListBox1 и ListBox2. Теперь, когда PivotItem1 активен и отображает ListBox1, ListBox2 жалуется на то, что его источник данных не найден, что верно, потому что текущий DataContext не содержит коллекцию, к которой он привязан. Это ошибка (я добавил перерывы дополнительных строк):

System.Windows.Data Error: BindingExpression path error: 
'Entries' property not found on 'MyApp.ViewModels.CategoriesView' 
'MyApp.ViewModels.CategoriesView' (HashCode=79283607). 
BindingExpression: Path='Entries' 
DataItem='MyApp.ViewModels.CategoriesView' 
(HashCode=79283607); target element is 
'System.Windows.Controls.ListBox' (Name='ListBox2'); 
target property is 'ItemsSource' (type 'System.Collections.IEnumerable').. 

Точно так же, когда PivotItem2 активен, ListBox1 выдает ошибку. Я обновляю DataContext в событии LoadingPivotItem Pivot. Я также пробовал делать это в событии LoadedPivotItem, но получаю ту же ошибку.

Обе коллекции реализуют INotifyPropertyChanged, и, как я уже упоминал в начале, все работает, несмотря на ошибку. Я хотел бы как-то подавить ошибку.

Вот XAML для одного в ListBoxes:

<ListBox x:Name="ListBox1" 
     Margin="0,0,-12,0" 
     ItemsSource="{Binding Categories}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel Margin="0,0,0,17" 
        Width="432"> 
     <TextBlock Text="{Binding CategoryName}" 
        TextWrapping="Wrap" 
        Margin="12,0,0,0" 
        Style="{StaticResource PhoneTextExtraLargeStyle}" /> 
     </StackPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Другой идентичны, за исключением «Категории» заменяется на «Записи» и «CategoryName» по «EntryName».

Заранее за вашу помощь.

ответ

1

Несмотря на то, что действие, которое вы выполняете, не вызывает ошибок в вашем приложении, будет оказывать влияние на устройство в целом, в то время как среда Silverlight обрабатывает ошибки привязки.

Вместо того, чтобы иметь две разные модели данных и изменять их, почему бы не создать одну модель, которая содержит модели «Категории» и «Записи», а просто установить ту, которую вы не показываете как пустую коллекцию (или что-то еще при необходимости). Это позволит привязкам по-прежнему работать, но предотвратит показ отображаемых списков.

+0

Это отличная идея. Мне любопытно, известно ли это об известном поведении, что делается попытка загрузить привязки неактивных элементов пользовательского интерфейса в настоящее время? – Praetorian

+0

@Praetorian Я ожидал, что все привязки будут оцениваться одновременно с целью поиска проблем (повышение ошибок привязки) как можно скорее. Небезопасно предположить, что привязки будут обновляться при изменении пользовательского интерфейса. Очень много общего (ожидается?) Для того, чтобы набор данных был установлен один раз, а затем изменения обрабатывались в viewmodel. –