2012-02-24 2 views
2

내 뷰 모델에서 바운드 속성을 업데이트 할 때 NullReferenceException이 발생합니다. 이것은 뷰에서 treeview 컨트롤을 사용할 때만 발생합니다. 목록으로 대체하면 예외가 사라집니다. 어쩌면 소개NullReferenceException Treeview 및 PropertyChanged 사용

PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 

30 호출 후, 많은 PresentationFramework 및 WindowsBase 어셈블리를 통해 예외가 실제로 여기에 발생합니다 :

PresentationFramework.dll!System.Windows.StyleHelper.EvaluateOldNewStates() 

이가 내 코드에서 디버거 나누기 어디

입니다 트 리뷰 :

<TreeView DockPanel.Dock="Bottom" ItemsSource="{Binding Source={StaticResource cvs}, Path=Groups}" 
        ItemTemplate="{StaticResource categoryTemplate}" SelectedItemChanged="TreeView_SelectedItemChanged"/> 

그리고이 목록 상자를 대신 사용하면, 해당 속성을 업데이트하기 위해 전화를

public ObservableCollection<ApplicationServer> ApplicationServers 
     { 
      get { return this._applicationServers; } 

      private set 
      { 
       this._applicationServers = value; 
       this.NotifyPropertyChanged(() => this.ApplicationServers); 
      } 
     } 

을 그리고 여기에 있습니다 : : 업데이트되는 속성을

<ListBox DockPanel.Dock="Bottom" ItemsSource="{Binding ApplicationServers}" DisplayMemberPath="Name" 
        SelectedItem="{Binding SelectedApplicationServer}" Height="auto"/> 

내가이 도움이 될 것이라고 잘 모르겠지만, 여기에 있습니다 : 문제는 사라질

this.ApplicationServers = new ObservableCollection<ApplicationServer>(ApplicationServerLogic.GetAll().ToList()); 

경험이있는 사람이 있습니까? 문제의 원인을 알지 못하고 목록 상자를 사용하려고합니다. 실제로, 나는 꽤 많이 그 순간에리스트 박스를 사용해야한다. 어떻게이 문제를 해결할 수 있습니까? PresentationFramework 어셈블리의 버그일까요?

또한 내보기의 코드 숨김으로 항목 변경 이벤트 처리를 보여줍니다.

private void TreeView_SelectedItemChanged(object sender, System.Windows.RoutedPropertyChangedEventArgs<object> e) 
     { 
      ((ApplicationServerViewModel)DataContext).SelectedApplicationServer = e.NewValue as ApplicationServer; 
     } 

편집 : 누군가가 이렇게 여기있다, 더 많은 코드를 요구 :

 <CollectionViewSource x:Key="cvs" Source="{Binding ApplicationServers}"> 
      <CollectionViewSource.GroupDescriptions> 
       <PropertyGroupDescription PropertyName="DeploymentEnvironment"/> 
      </CollectionViewSource.GroupDescriptions> 
      <CollectionViewSource.SortDescriptions> 
       <scm:SortDescription PropertyName="Name" Direction="Ascending"/> 
      </CollectionViewSource.SortDescriptions> 
     </CollectionViewSource> 

     <!-- Our leaf nodes (server names) --> 
     <DataTemplate x:Key="serverTemplate"> 
      <TextBlock Text="{Binding Path=Name}"/> 
     </DataTemplate> 

     <!-- Note: The Items path refers to the items in the CollectionViewSource group (our servers). 
        The Name path refers to the group name. --> 
     <HierarchicalDataTemplate x:Key="categoryTemplate" 
            ItemsSource="{Binding Path=Items}" 
            ItemTemplate="{StaticResource serverTemplate}"> 
      <TextBlock Text="{Binding Path=Name}" FontWeight="Bold"/> 
     </HierarchicalDataTemplate> 
+0

setter를 통해 컬렉션 인스턴스를 변경하는 대신 항목을 컬렉션에 추가하는 것만 큼 없습니까? 모든 BS 코드를 제거하려고 시도한 ObservableCollection ' –

+0

에 컬렉션 변경 이벤트가 발생합니다. 'SelectedItemChanged = "TreeView_SelectedItemChanged"'. 'this.NotifyPropertyChanged (() => this.ApplicationServers);'to'새로운 PCEA ("ApplicationServers")'. 'categoryTemplate'은 어떻게 생겼습니까? MORE CODE PLZ –

+0

@Aaron : 당신의 제안이 효과가 있었고 계속해서 treeview를 사용할 수있게되었습니다. 고맙습니다. –

답변

1

동안은 대답하지 않는 이유를 귀하의 경우; 한 가지 방법은 항목을 수집 인스턴스에 추가하는 것과 설정자를 통해 인스턴스를 변경하는 것입니다. 노출 된 세터를 제거하고 필요에 따라 아이템을 추가하면 궁극적으로 당신이 무엇을 얻을 수 있는지를 나타내는 기본 콜렉션에 CollectionChanged 이벤트가 발생합니다.

 public ObservableCollection<ApplicationServer> ApplicationServers 
     { 
      get { return this._applicationServers; } 
     } 

     ApplicationServers.Add(...);