【问题标题】:How to update an Observable Collection with constantly changing data如何使用不断变化的数据更新 Observable Collection
【发布时间】:2022-02-04 10:17:38
【问题描述】:

我正在用 C# 编写一些代码,其中 Observable 集合应该获取字符数组中字符的值,并根据初始化后的值显示晶圆的不存在或存在,这需要大约 30 秒才能完成。但是,模型只是显示空白,没有涉及数据。我尝试使用 {get; 将数组公开set;} 以及为初始化引入时间延迟,但它仍然显示空白。我想问一下如何让 Observable Collections 不断更新模型,而不仅仅是静态的。我尝试更改 XAML 文件中的 UpdateSourceTrigger,但也没有任何更改。如果我能得到任何指示以向我指明正确的方向,我将不胜感激。

 public class LPMModel : NotifyPropertyChanged
{
    #region Fields

    private static int nextIndex, nextIndexL = 0;
    private int index;
    private int indexL;
    private bool status;
    private bool enable;
    public char[] WafPreSta;
    public char[] wmapLPM1 { get; set; }
    private readonly ObservableCollection<WaferModel> sloatWaferCollection;

    #endregion Fields

    

  
    public int Index { get => indexL; set => indexL = value; }

    public bool Status { get => status; set => status = value; }

    public bool Enable { get => enable; set => enable = value; }

    
    public ObservableCollection<WaferModel> SlotWaferCollection => sloatWaferCollection;

  

    
    public override string ToString()
    {
        return string.Format("LPM #{0}", Index);
    }

    
    public LPMModel()
    {
        Thread.Sleep(30000);
        indexL = ++nextIndexL;
        index = nextIndex++;
        sloatWaferCollection = new ObservableCollection<WaferModel>();
        while (wmapLPM1 != null)
        {
            for (int i = 25; i > 0; i--)
            {

                switch (wmapLPM1[i-1])
                {
                    case '1':
                        status = true;
                        break;

                    case '0':
                        status = false;
                        break;

                    default:
                        break;
                }

                //status = true;
                sloatWaferCollection.Add(new WaferModel(status, i, this));
                
            }
        }
        
       
    }
}

}

【问题讨论】:

  • 在哪里初始化 wmapLPM1 并将数据加载到其中?您是否检查过 wmapLPM1 是否已加载?
  • wmapLPM1 被初始化并加载到另一个 C# 程序中,该程序链接到此代码所链接到的解决方案文件,是的,wmapLPM1 加载了一个示例数组,如下所示:(0001010101010101010100001)

标签: c# collections observable global


【解决方案1】:

快速查看您的代码,我看不到您在哪里填充 wmapLPM1;提供有关您的代码的更多详细信息,然后希望有人可以正确地帮助您

       public class WaferModel 
{

    public int Index { get; set; } public bool Status { get; set; } public bool Enable { get; set; }
}
public class LPMModel : INotifyPropertyChanged
{
    #region Fields

    private static int nextIndex, nextIndexL = 0;
    private int index;
    private int indexL;
    private bool status;
    private bool enable;
    public char[] WafPreSta;
    public char[] wmapLPM1 { get; set; }
    private readonly ObservableCollection<WaferModel> sloatWaferCollection;

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion Fields




    public int Index { get => indexL; set => indexL = value; }

    public bool Status { get => status; set => status = value; }

    public bool Enable { get => enable; set => enable = value; }


    //public ObservableCollection<WaferModel> SlotWaferCollection = new();




    public override string ToString()
    {
        return string.Format("LPM #{0}", Index);
    }


    public LPMModel()
    {
        sloatWaferCollection = new ObservableCollection<WaferModel>();
    }
    public void runLPML()
    {
        Thread.Sleep(30);
        indexL = ++nextIndexL;
        index = nextIndex++;
        int count = 25;
        WaferModel wafer = new();
        while (wmapLPM1 != null)
        {
            for (int i = count; i > 0; i--)
            {

                switch (wmapLPM1[i - 1])
                {
                    case '1':
                        status = true;
                        break;

                    case '0':
                        status = false;
                        break;

                    default:
                        break;
                }

                //status = true;
                wafer.Status = status;
                wafer.Index = i;
                wafer.Enable = true;//false?
                sloatWaferCollection.Add(wafer);
                count -= 1;
                Console.WriteLine(sloatWaferCollection);

            }
        }
    }
}

【讨论】:

  • 我正在使用串行数据从另一个 C# 程序加载 wmapLPM1,因此它从数据流中获取输出,然后将其中的一部分保存为字符数组供 LPMModel 使用。并更新 WaferModel
【解决方案2】:

这是加载 wmapLPM1 的代码。我尝试以 markdown 格式对其进行编辑,但我不确定它在 cmets 中的显示方式。

void CommMap1_DataReceived(object sender, SerialDataReceivedEventArgs e)  
{  
   byte[] buff = new byte[9600];
   commMap1.Read(buff, 0, 9600);
   string response = System.Text.Encoding.ASCII.GetString(buff, 0, 9600);
   int map1start = response.IndexOf("/");
   string mapLPM1 = response.Substring(map1start + 1, 25);
   wmapLPM1 = mapLPM1.ToCharArray();
}

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 2022-01-27
    • 2021-12-25
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多