如何将带有一个参数的函数传递给iccommand

本文关键字:函数 iccommand 参数 有一个 | 更新日期: 2023-09-27 18:03:36

我的iccommand:

public ICommand ConfirmLotSavedCommand {
        get
        {
            return new RelayCommand(ConfirmLotSaved);
        }
    }

问题是我有反序列化的数据,我想存储到数据库后,用户单击确认按钮。如果用户没有单击确认或批号已经存在,那么我不想在db中保存反序列化的字符串。

由于作用域的关系,我在ConfirmLotSaved()方法中调用带有一个参数的函数时遇到了麻烦。

因此,我创建了一个将反序列化的批次设置为字段,并将代码保存到ConfirmLotSaved()中的db中。然而,由于一些奇怪的原因,该字段为空…我不知道为什么。

这是我的尝试:

private LotInformation lot; //field that is supposed to contain all the deserialized info 
private void ConfirmLotSaved()
    {
        using (var db = new DDataContext())
        {
            bool lotNumDbExists = db.LotInformation.Any(r => r.lot_number == DeserialLotNumber);
            if (lotNumDbExists == false)
            {
                successWindow.Message = "Successfully Saved Lot";
                dialogService.ShowDialog(successWindow.Message, successWindow);
                LotInformation newLot = new LotInformation();
                if (newLot != null)
                {
                    newLot.Id = lot.Id;
                    newLot.lot_number = lot.lot_number;
                    newLot.exp_date = lot.exp_date;
                    LotNumber = Lot.lot_number;
                    ExpirationDate = Lot.exp_date.ToString();
                    foreach (Components comp in lot.Components)
                    {
                        newLot.Components.Add(comp);
                    }
                    ComponentsList = newLot.Components;
                    foreach (Families fam in lot.Families)
                    {
                        newLot.Families.Add(fam);
                    }
                    FamiliesList = newLot.Families;
                    try
                    {
                        db.LotInformation.Add(newLot);
                        db.SaveChanges();
                        //Grabs the lot_number column from db that is distinct
                        var lotNum = db.LotInformation.GroupBy(i => i.lot_number).Select(group => group.FirstOrDefault());
                        //Loops through the lot numbers column in db and converts to list 
                        foreach (var item in lotNum)
                        {
                            Console.WriteLine(item.lot_number);
                        }
                        LotNumList = lotNum.ToList();
                        Console.WriteLine("successfully");
                    }
                    catch
                    {
                        //TODO: Add a Dialog Here
                    }
                }
                else if (lotNumDbExists == true)
                {
                    // Inform user that the lot_number already exists
                    errorWindow.Message = LanguageResources.Resource.Lot_Exists_Already;
                    dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow);
                    logger.writeErrLog(LanguageResources.Resource.Lot_Exists_Already);
                    return;

                }
            }
        }
    }

反序列化函数,查看lot在哪里抓取数据:

 public void DeserializedStream(string filePath)
    {
        XmlRootAttribute xRoot = new XmlRootAttribute();
        xRoot.ElementName = "lot_information";
        xRoot.IsNullable = false;
        // Create an instance of lotinformation class.
       LotInformation lot = new LotInformation();
        // Create an instance of stream writer.
        TextReader txtReader = new StreamReader(filePath);
        // Create and instance of XmlSerializer class.
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(LotInformation), xRoot);
        // DeSerialize from the StreamReader
        lot = (LotInformation)xmlSerializer.Deserialize(txtReader);
        // Close the stream reader
        txtReader.Close();
        LotInformation newList = new LotInformation();
        using (var db = new DDataContext())
        {
            bool isDuplicate = db.LotInformation.Any(r => r.lot_number == lot.lot_number);
            if (newList != null && isDuplicate == false)
            {
                newList.Id = lot.Id;
                newList.lot_number = lot.lot_number;
                newList.exp_date = lot.exp_date;
                DeserialLotNumber = newList.lot_number;
                DeserialExpirationDate = newList.exp_date.ToString();
                foreach (Component comp in lot.Components)
                {
                    newList.Components.Add(comp);
                }
                DeserialComponentsList = newList.Components;
                foreach (Families fam in lot.Families)
                {
                    newList.Families.Add(fam);
                }
                DeserialFamiliesList = newList.Families;
            }
            else if (isDuplicate == true)
            {
                DeserialAnalytesList = null;
                DeserialFamiliesList = null;
                // Inform user that the lot_number already exists
                errorWindow.Message = LanguageResources.Resource.Lot_Exists_Already;
                dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow);
                logger.writeErrLog(LanguageResources.Resource.Lot_Exists_Already);
                return;
            }
        }
    }

如何将带有一个参数的函数传递给iccommand

我明白是怎么回事了:

在构造函数之前设置private LotInformation lot;字段后,我在本地重新声明了我的错误:

 LotInformation lot = new LotInformation();

改成:

lot = new LotInformation(); 

,它可以工作。

我建议你使用RelayCommand的通用版http://www.kellydun.com/wpf-relaycommand-with-parameter/

它将允许您从视图传递lot到您的命令,所有您需要在当前DataContext中存储lot。