2013-10-02 5 views
0

ItemsSource와 함께 목록 상자를 사용하는 동안 ObservableCollection에 항목을 추가하는 데 문제가 있습니다. 내 viewmodels 생성자에서 테스트 용 더미 데이터를 추가합니다.MVVM WPF ObservableCollection : ItemsSource 바인딩 추가 항목의 오류

내 뷰 모델 : 지금까지

public class KabaDeviceListViewModel : KabaBase 
{ 

    private ObservableCollection<KabaDeviceDetailViewModel> _details; 

    public ObservableCollection<KabaDeviceDetailViewModel> KabaDevices 
    { 
     get { return _details; } 
     set 
     { 
      if (value != _details) 
      { 
       _details = value; 
       OnPropertyChanged("KabaDevices"); 
      } 
     } 
    } 


    public KabaDeviceListViewModel() 
    { 

     ObservableCollection<KabaDeviceDetailViewModel> _details = new ObservableCollection<KabaDeviceDetailViewModel>(); 

     KabaDevice kd1 = new KabaDevice("localhost A", "127.0.0.1", true); 
     KabaDeviceDetailViewModel dvm = new KabaDeviceDetailViewModel(kd1); 
     _details.Add(dvm); 

     KabaDevice kd2 = new KabaDevice("localhost B", "127.0.0.1", true); 
     KabaDeviceDetailViewModel dvm2 = new KabaDeviceDetailViewModel(kd2); 
     _details.Add(dvm2); 

     this.KabaDevices = _details; 
    } 
} 

너무 좋아하지만, 오류가 목록 상자의 ItemsSource에, 여기 XAML 코드에서 발생합니다. 나는 내가 뭘 잘못하고 있는지 보지 못한다. VS2010과 .NET 4.0을 사용합니다.

<UserControl x:Class="KabaTest.View.KabaDeviceListView" 
     ... 
     xmlns:myViewModels="clr-namespace:KabaTest.ViewModel" 
     xmlns:myViews="clr-namespace:KabaTest.View"> 
<UserControl.DataContext> 
    <myViewModels:KabaDeviceListViewModel/> 
</UserControl.DataContext> 
<Grid> 
    <ListBox Margin="5" 
      ItemsSource="{Binding Path=KabaDevices, Mode=TwoWay}" > 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" > 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel IsItemsHost="True" Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
      <DataTemplate DataType="{x:Type myViewModels:KabaDeviceDetailViewModel}" > 
       <myViews:KabaDeviceDetailView DataContext="{Binding }"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

ItemsSource에서의 InnerException은 다음과 같습니다 { "ItemsSource 사용 액세스에 대신 ItemsControl.ItemsSource와 요소를 수정하면서 작업이 유효하지 않습니다.."}. 당신의 도움을 주셔서 감사합니다!

+0

KabaDevices 속성을 사용하는 대신 목록 상자에서 직접 항목을 추가/제거하려고하는 다른 코드가 있습니까? –

답변

1

생성자에 문제가있을 수 있습니다. 해당 백업 필드 을 해당 백업 필드의 공용 속성 KabaDevices에 지정하십시오. 이것이 예외의 이유인지 아닌지 100 % 확신 할 수는 없지만 내가 말할 수있는 한 모든 것이 잘 작동해야합니다. 이것을 시도하십시오 :

public KabaDeviceListViewModel() 
{ 

    var details = new ObservableCollection<KabaDeviceDetailViewModel>(); 

    KabaDevice kd1 = new KabaDevice("localhost A", "127.0.0.1", true); 
    KabaDeviceDetailViewModel dvm = new KabaDeviceDetailViewModel(kd1); 
    details.Add(dvm); 

    KabaDevice kd2 = new KabaDevice("localhost B", "127.0.0.1", true); 
    KabaDeviceDetailViewModel dvm2 = new KabaDeviceDetailViewModel(kd2); 
    details.Add(dvm2); 

    this.KabaDevices = details; 
} 
+0

당신이 이것을 암시했기 때문에 오류의 원인이 아닙니다. this.KabaDevices = _details; @ user2135342 코드는 if (value! = _details)가 절대로 참이지 않으므로 비효율적입니다. 나는 진짜 오류가 우리가 볼 수없는 코드에 있다고 생각한다. 귀하의 코드 변경 제안 비록 자리에있다! –

+0

안녕하세요, 마크, 빠른 답변 주셔서 감사합니다. 나는 이것을 이미 시도했지만, 불행하게도 이것은 문제를 해결하지 못한다. 생성자의 viewmodels 추가 잘 작동하지만 ... 어떻게 든 그것은 ItemsSource의 사용법과 호환되지 않습니다? 어쨌든 다시 한번 감사드립니다! – user2135342

+0

안녕하세요. 실제로 모든 장면 뒤에 뭔가 잘못된 것이있었습니다 (위의 코드를 참조하십시오). 나는 내가 무엇을 바꿨는지를 정확히 기억할 수는 없지만 필요한 곳에 귀하의 견해를 고려했습니다. 그런 식으로 당신의 대답이 도움이된다고 생각합니다. 고마워요! 친애하는. – user2135342