【问题标题】:ObservableCollection not updating item sourceObservableCollection 不更新项目源
【发布时间】:2014-01-29 17:52:24
【问题描述】:

我有一个从网络线程填充的可观察集合。如果使用虚拟数据从构造函数填充 OC,它将显示在 UI 上。我知道项目正在从网络线程添加到集合中,但项目计数永远不会在 UI 上更新。

我的视图模型如下:

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>

【问题讨论】:

    标签: c# wpf data-binding mvvm mvvm-light


    【解决方案1】:

    您必须在视图模型中更新集合时触发 PropertyChanged 事件 并且您的视图模型必须实现 INotifyPropertyChanged

    【讨论】:

      【解决方案2】:

      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")

      【讨论】:

      • 我将项目添加到可观察集合中,而不是创建集合的新实例。因此,在这种情况下,不需要对财产变更进行加薪。此外,如果我在 VM 构造函数中添加项目,则数据会显示在 UI 上。
      • 我认为你仍然需要从INotifyPropertyChanged继承你的类
      【解决方案3】:

      所以在 System.Collections.ObjectModel 中有 2 种类型的可观察集合一种; Remotion.Linq.Collections 中的一个;显然,当使用单独的线程时,Remotion 集合不会正确更新。更改为 System.Collections.ObjectModel,现在一切正常。

      【讨论】:

        【解决方案4】:

        您需要将项目添加到 UI 线程中的 ObservableCollection&lt;&gt;,以便它根据需要重新绘制/更新控件。

        【讨论】:

          【解决方案5】:

          您是否尝试过使用 Distacher 线程在 UI 线程上同步添加项目?这是可以尝试的:

          而不是:

          Manikins.Add(csvm);
          

          你替换为:

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

          希望能帮到你

          【讨论】:

          • 我已经尝试包装它并包装整个函数,但它仍然没有显示在 GUI 上。我知道这通常有效,但在这种情况下,我没有运气这样做。
          【解决方案6】:

          ObservableCollection 在引发事件 CollectionChanged 时更新 UI 实际上是在您添加/删除此集合中的项目时... () 方法,实际上这很奇怪,UI 没有更新,所以首先检查是否确实有项目添加到集合中,其次确保代码中没有任何内容将整个集合设置为新引用...希望对您有所帮助

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-11-24
            • 1970-01-01
            • 2012-07-04
            • 2011-07-02
            • 1970-01-01
            • 2015-04-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多