2012-07-05 5 views
0

List 객체에 저장된 ToDo의 간단한 목록이 데이터 바인딩을 통해 ListBox에 표시됩니다. 항목을 클릭 할 수 있으며 작업을 삭제할 수있는 세부 정보 페이지로 이동합니다. 모든 것은 정상적으로 작동하지만 뒤로 버튼을 클릭하면 ArgumentOutOfRangeException이 발생하고 앱이 다운됩니다.목록을 포함하는 페이지로 돌아갈 때 ArgumentOutOfRangeException이 발생했습니다.

이제 앱이 목록에 항목이 있다고 생각하기 때문에 수집 한 것입니다.하지만 수정 방법은 확실하지 않습니다.

System.Windows.dll에서 예외가 발생합니다. 구체적인 내용은 없습니다. 또한 OnNavigatedTo 이벤트 후에 예외가 발생하는 것을 알고 있습니다.

XAML (단지 목록 상자 - 다소 단순화) :

<ListBox Name="MyActivitiesList" ItemsSource="{Binding MyActivities}" SelectionChanged="ListBox_SelectionChanged"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ListBoxItem> 
       <StackPanel Margin="0,0,0,12"> 
        <-- context menu was here, but has been removed --> 
        <TextBlock Text="{Binding Title}" Style="{StaticResource BigHeader}"/> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Category.Name}" Style="{StaticResource SubtleText}"/> 
         <TextBlock Text=" - " Style="{StaticResource SubtleText}"/> 
         <TextBlock Text="{Binding VotesPercentage}" Style="{StaticResource SubtleText}"/> 
         <TextBlock Text="% positive" Style="{StaticResource SubtleText}" /> 
        </StackPanel> 
       </StackPanel> 
      </ListBoxItem> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

코드 숨김

private MyActivitiesViewModel myActivitiesViewModel; 

public MyActivitiesView() 
{ 
    InitializeComponent(); 
} 

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
{ 
    myActivitiesViewModel = new MyActivitiesViewModel(); 
    this.DataContext = myActivitiesViewModel; 
    base.OnNavigatedTo(e); 
} 

protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e) 
{ 
    MyActivitiesList.SelectedItem = null; 
    base.OnNavigatingFrom(e); 
} 

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (((ListBox)sender).SelectedItem != null) 
    { 
     var idea = ((ListBox)sender).SelectedItem as Idea; 
     ((ListBox)sender).SelectedItem = null; 

     Dispatcher.BeginInvoke(() => NavigationUtility.Navigate(new Uri("/View/IdeaView.xaml", UriKind.Relative), idea)); 

    } 
} 

어떤 아이디어? 도와 주시면 대단히 감사하겠습니다!

+0

'MyActivitiesList.SelectedItem = null;'을'MyActivitiesList.SelectedIndex = -1; '으로 변경해보십시오. 그렇게하면 SelectionChanged 이벤트 핸들러에 대해주의하십시오. – nkchandra

+0

SelectedItem/Index에 대한 전체 종속성을 제거하고 탭 이벤트를 사용하여도 내 문제에 아무런 영향을주지 않습니다. –

+0

'System.Windows.dll에서 예외가 발생했습니다. 콜 스택이 있으십니까? –

답변

1

같은 항목이 목록 상자의 현재 항목에 바인딩되어있는 동안 항목을 목록에서 삭제하는 것이 문제라고 생각합니다.

쉽게 해결할 수있는 한 가지 방법은 List 대신 ObservableCollection을 사용하는 것입니다. 컬렉션은 INotifyCollectionChanged 메커니즘을 사용하여 삭제에 대해 목록 상자에 알려줍니다.

+0

그럴 수도 있겠지만 - 목록을 업데이트 할 때 (즉, 무언가 삭제할 때) 목록 자체에 대해 onPropertyChanged 이벤트를 수동으로 실행하면 동일한 효과가 나타나지 않겠습니까? –

+0

ObservableCollection을 사용하고 싶지 않다면 컨트롤을 작성한 사람이'if (existing == new) return;'에 대한 검사를 수행했는지에 따라 달라집니다 ... IfotifyCollectionChanged를 구현하는 것은 어렵지 않습니다. 사소한 수준에서 어떤 일이 생길 때마다 '재설정'을 할 수 있습니다. – Stuart

관련 문제