2014-01-10 137 views
1

我有一個可觀察的集合正在從網絡線程填充。如果使用虛擬數據從構造函數填充OC,則會在UI上顯示。我知道這些項目正在從網絡線程添加到集合中,但項目數量從未在UI上更新。ObservableCollection不更新項目源

我的視圖模型如下:

public class ManikinStatusViewModel : DiViewModelBase 
{ 
    private readonly ICommunicationService manikinCommunicationService; 

    #region Properties 
    public ObservableCollection<CasualtyStatusViewModel> Manikins { get; private set; } 
    #endregion 

    public ManikinStatusViewModel() 
    { 
     Manikins = new ObservableCollection<CasualtyStatusViewModel>(); 

     uow = UnitOfWorkFactory.Instance.CreateRunScenarioUnitOfWork(false); 

     AccelermeterPacketData apd = new AccelermeterPacketData(56, 57, 58); 

     manikinCommunicationService = new TestingCommunicationService(LoadAnalogSensorData(), apd); 
     manikinCommunicationService.ManikinDataReceived += ManikinCommunicationService_ManikinDataReceived; 

    } 

    #region Events 
    private void ManikinCommunicationService_ManikinDataReceived(object sender, ManikinDataReceivedEventArgs e) 
    { 
     if (e.ManiknDataPacket != null) 
     { 
      var manikin = Manikins.ToList().Find(m => m.ManikinId == e.ManiknDataPacket.SerialNumber); 

      if (manikin == null) 
      { 
       Debug.WriteLine("Creating manikin with serial number: " + e.ManiknDataPacket.SerialNumber); 

       CasualtyStatusViewModel csvm = new CasualtyStatusViewModel(e.ManiknDataPacket.SerialNumber); 
       Manikins.Add(csvm); 

       manikin = csvm; 

       Debug.WriteLine("manikin count is: " + Manikins.Count()); 

      } 

      manikin.UpdateManikinStatus(e.ManiknDataPacket); 
     } 
    } 

    #endregion 

我模特兒集合結合下面的視圖。

<TabControl Grid.Row="1" ItemsSource="{Binding Manikins}" Name="ManikinsTabControl"> 
     <TabControl.Resources> 
      <Style TargetType="TabItem"> 
       <Setter Property="Header" Value="Casualty"></Setter> 
       <Setter Property="ContentTemplate" Value="{StaticResource CasualtyTemplate}"></Setter> 
      </Style> 
     </TabControl.Resources> 
    </TabControl> 

回答

1

所以有兩種類型的可觀察集合一個在System.Collections.ObjectModel;一個在Remotion.Linq.Collections中;顯然Remotion集合在使用單獨的線程時不能正確更新。更改爲System.Collections.ObjectModel,現在全部看起來工作正常。

0

您需要的項目,以在UI線程被添加到ObservableCollection<>它根據需要重繪/更新控制。

2

你必須上升,對您的視圖模型 更新收集PropertyChanged事件和您的視圖模型必須執行INotifyPropertyChanged

0

你有沒有試着用Distacher線程同步添加UI線程上的項目?這裏是一些嘗試:

相反的:

Manikins.Add(csvm); 

您替換爲:

Dispatcher.BeginInvoke(DispatcherPriority.Normal , new Action(() => 
{ 
    Manikins.Add(csvm); 
} 
)); 

希望這hepls

+0

我試過包裝和包裝整個功能,它仍然不顯示在GUI上。我知道這通常有效,但在這種情況下,我沒有這樣做的運氣。 – joshwl2003

1

的UI不知道什麼時候您的收藏正在被更新。你必須實際通知它。要做到這一點,這裏有你需要遵循的步驟:

  1. 實施/從INotifyPropertyChanged

  2. 繼承複製粘貼此代碼。我不會詳細介紹這些細節,但這是非常通用的代碼,可以與任何類一起使用。

    public event PropertyChangedEventHandler PropertyChanged; 
    
    protected virtual void OnPropertyChanged(string PropertyName) 
    { 
        PropertyChangedEventHandler handler = PropertyChanged; 
        if (handler != null) 
        { 
         handler(this, new PropertyChangedEventArgs(PropertyName)); 
        } 
    } 
    
  3. 現在,每當你的更新列表,調用OnPropertyChanged方法,並通過更改屬性的名稱。 (在你的情況OnPropertyChanged("Manikins")

+0

我將項目添加到可觀察的集合中,而不是創建集合的新實例。所以在這種情況下,不需要提高財產變化。另外,如果我將這些項目添加到虛擬機構造函數中,數據將顯示在用戶界面上。 – joshwl2003

+0

我認爲你仍然需要從'INotifyPropertyChanged'繼承你的類 – ArsalanDotMe

0

的ObservableCollection更新UI當事件CollectionChanged其實,當你添加/這個集合中刪除的項...如果保持集合改變UI不會被更新升高.. 。我見過你使用了Manikins.Add()方法,實際上這很奇怪,UI沒有更新,所以先檢查是否有真正的項目添加到集合中,其次確保代碼中沒有任何設置整個收集到一個新的參考...希望有幫助

相關問題