Question

Here's my property that determines if I should bind the other properties or not:

public string LotNumber {
        get {
            return lotNumber;
        }
        set {
            using (var db = new DDataContext()) {
                lotNumber = value;
                // Check for duplicates
                bool isDuplicate =
                     db.LotInformation.Any(r => r.lot_number == lotNumber);
                if (isDuplicate == true) {
                    ComponentsList = null;
                    FamiliesList = null;
                    ExpirationDate = null;
                    LotNumber = null;
                    lotNumber = 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;
                } else {
                    lotNumber = value;
                }
                RaisePropertyChanged("LotNumber");
            }
        }
    }

My problem right now is if I upload a file and if the lot number already exists in the database, the boolean returns true and an error message is thrown. However, after that,it loops again and then the boolean is set to false since now the value is null and it still binds the data afterward. How can I break out of the loop and just make it stop running/clear/prevent binding when bool is true in the case above?

Was it helpful?

Solution

I assume you have some code like this:

LotNumber = "ABC5";  // ABC5 already exists in the database - uh oh!

And then you're trying to figure everything out in the "setter". It's already too late by that point. Instead, move your logic into separate methods:

private bool LotNumberExists(string lotNumber)
{
    using (var db = new DDataContext())
    {
        return db.LotInformation.Any(r => r.lot_number == lotNumber);
    }
}

private void ClearFields()
{
    ComponentsList = null;
    FamiliesList = null;
    ExpirationDate = null; 
    LotNumber = null;
}

private void InformUserOfDuplicate()
{
    // 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);
}

Then check the return value of that method before setting LotNumber.

private void SomeOtherMethod()
{
    string someLotNumber = "ABC5";

    if (LotNumberExists(someLotNumber)
    {
        ClearFields();

        InformUserOfDuplicate();

        return;
    }

    LotNumber = someLotNumber;
}

Turn your setter back into a simple setter without a ton of logic wrapped up in it:

public string LotNumber
{
    get { return lotNumber; }
    set
    {
        lotNumber = value;

        RaisePropertyChanged("LotNumber");
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top