2013-10-02 81 views
0

我遇到麻煩,將項目添加到ObservableCollection時使用ItemsSource列表框。我在我的viewmodels構造函數中添加了用於測試的虛擬數據。MVVM WPF ObservableCollection:錯誤addign項目,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; 
    } 
} 

到目前爲止好,但在XAML代碼在這裏出現錯誤,在列表框的ItemsSource的。我不明白我做錯了什麼。我使用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

你的應用程序中是否有任何其他代碼試圖直接向/從ListBox添加/刪除項目,而不是使用KabaDevices屬性? –

回答

1

您的構造函數可能存在問題。您將支持字段_details分配給該支持字段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

正如你暗示這不是錯誤的原因。這個.KabaDevices = _details;在@ user2135342代碼中無效,因爲if(value!= _details)永遠不會成立。我懷疑真正的錯誤是在我們看不到的代碼中。雖然你的代碼更改建議是現貨! –

+0

嗨馬克,感謝您的快速回答。我已經試過了,不幸的是這並不能解決問題。在構造函數中添加viewmodels工作得很好......但不知何故它與ItemsSource的用法不兼容?無論如何,再次感謝! – user2135342

+0

大家好,事實上,幕後出現了一些問題(在上面的代碼之外)。我無法完全記得我改變了什麼,但是我已經在需要時考慮到了你的意見。這樣我認爲你的答案很有幫助。非常感謝!最好的祝福。 – user2135342