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