C# 如果存在重复,如何清除/防止绑定到datagrid?

C# 如果存在重复,如何清除/防止绑定到datagrid?,c#,wpf,datagrid,C#,Wpf,Datagrid,以下是我的属性,它决定我是否应该绑定其他属性: public string LotNumber { get { return lotNumber; } set { using (var db = new DDataContext()) { lotNumber = value; // Check for duplicates

以下是我的属性,它决定我是否应该绑定其他属性:

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

我现在的问题是,如果我上传了一个文件,并且数据库中已经存在批号,那么布尔值返回true,并抛出一条错误消息。但是,在此之后,它再次循环,然后布尔值被设置为false,因为现在值为null,之后它仍然绑定数据。当bool在上述情况下为true时,如何打破循环并使其停止运行/清除/防止绑定

我假设您有如下代码:

LotNumber = "ABC5";  // ABC5 already exists in the database - uh oh!
然后你试图在“setter”中找出所有的东西。到那时已经太晚了。相反,将您的逻辑移动到单独的方法中:

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);
}
然后在设置
LotNumber
之前检查该方法的返回值

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

    if (LotNumberExists(someLotNumber)
    {
        ClearFields();

        InformUserOfDuplicate();

        return;
    }

    LotNumber = someLotNumber;
}
将您的setter变回一个简单的setter,而不需要太多的逻辑:

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

        RaisePropertyChanged("LotNumber");
    }
}

哇,看起来很棒。我想我找到了为什么我的值保持绑定(另一种方法在没有适当验证的情况下首先绑定了值),但我想在将来记住这种格式。将在清理代码后更新。