또 다른 wpf 질문.wpf 데이터 격자의 바인딩 십진수 값 문제
10 진수 값을 사용하는 두 개의 DataGridTextColumn이 있습니다. 어떤 이유로 새 행을 추가 할 때 (열의 초기 값이 0 임)이 두 열 중 하나에서 값을 두 번 입력해야합니다. 처음 값을 입력하고 탭 아웃하면 값이 0으로 돌아갑니다. 두 번째 값을 입력 한 후에도 그대로 유지됩니다.
<DataGridTextColumn Header="Unit Price" EditingElementStyle="{StaticResource CellEditStyle}" Width="SizeToCells" MinWidth="90" Binding="{Binding ItemUnitPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<DataGridTextColumn Header="Qty" EditingElementStyle="{StaticResource CellEditStyle}" Width="SizeToCells" MinWidth="65" Binding="{Binding ItemQty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
dg는 내 VM에서 관찰 가능한 컬렉션에 바인딩됩니다. 나는 그것과 아무 상관이 있는지 모르겠지만, 나는 (사용자가 행을 떠날 때 데이터를 저장하는 데 사용) 별도의 클래스 만들어 내 OC에지며 EndEdit 이벤트를 추가 한 :
public class ObservableProjectExpenseItems : ObservableCollection<ProjectExpenseItemsBO>
{
protected override void InsertItem(int index, ProjectExpenseItemsBO item)
{
base.InsertItem(index, item);
item.ItemEndEdit += new ProjectExpenseItemsBO.ItemEndEditEventHandler((x) =>
{
if (ItemEndEdit != null)
ItemEndEdit(x);
});
}
public event ProjectExpenseItemsBO.ItemEndEditEventHandler ItemEndEdit;
}
내 사업을
public class ProjectExpenseItemsBO : IDataErrorInfo, IEditableObject
{
public int RowID { get; set; }
public int ProjectExpenseID { get; set; }
public string ItemNumber { get; set; }
public string ItemDescription { get; set; }
public decimal ItemUnitPrice { get; set; }
public decimal ItemQty { get; set; }
public string SupplierName { get; set; }
public DateTime CreateDate { get; set; }
public ProjectExpenseItemsBO()
{
}
// string method
static bool IsStringMissing(string value)
{
return String.IsNullOrEmpty(value) || value.Trim() == String.Empty;
}
private bool _isValid = true;
public bool IsValid
{
get { return _isValid; }
set { _isValid = value; }
}
#region IDataErrorInfo Members
public string Error
{
get
{
return this[string.Empty];
}
}
public string this[string propertyName]
{
get
{
string result = string.Empty;
if (propertyName == "ProjectExpenseID")
{
if (this.ProjectExpenseID == 0)
result = "An existing project expense item must be selected!";
}
if (propertyName == "ItemNumber")
{
if (this.ItemNumber != null)
{
if (IsStringMissing(this.ItemNumber))
result = "Item number cannot be empty!";
if (this.ItemNumber.Length > 50)
result = "Item number cannot be longer than 50 characters!";
}
}
if (propertyName == "ItemDescription")
{
if (this.ItemDescription != null)
{
if (this.ItemDescription.Length > 256)
result = "Item description cannot be longer than 256 characters!";
}
}
if (propertyName == "ItemUnitPrice")
{
if (this.ItemUnitPrice == 0.0M)
result = "Item unit price cannot be empty!";
}
if (propertyName == "ItemQty")
{
if (this.ItemQty == 0.0M)
result = "Item quantity cannot be empty!";
}
if (propertyName == "SupplierName")
{
if (this.SupplierName != null)
{
if (this.SupplierName.Length > 128)
result = "Item number cannot be longer than 128 characters!";
}
}
if (result.Length > 0)
IsValid = false;
else
IsValid = true;
return result;
}
}
#endregion
#region IEditableObject Members
public delegate void ItemEndEditEventHandler(IEditableObject sender);
public event ItemEndEditEventHandler ItemEndEdit;
public void BeginEdit()
{
//throw new NotImplementedException();
}
public void CancelEdit()
{
//throw new NotImplementedException();
}
public void EndEdit()
{
if (ItemEndEdit != null)
{
ItemEndEdit(this);
}
}
#endregion
}
}