class BindableXamDataGrid : XamDataGrid { private readonly static DependencyProperty SelectedRecordsDataItemsProperty = DependencyProperty.Register("SelectedRecordsDataItems", typeof(IList), typeof(BindableXamDataGrid), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); private readonly static DependencyProperty DeletedRecordsDataItemsProperty = DependencyProperty.Register("DeletedRecordsDataItems", typeof(IList), typeof(BindableXamDataGrid), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); private readonly static DependencyProperty UpdatedRecordDataItemProperty = DependencyProperty.Register("UpdatedRecordDataItem", typeof(object), typeof(BindableXamDataGrid), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public IList SelectedRecordsDataItems { get { return GetValue(SelectedRecordsDataItemsProperty) as IList; } set { SetValue(SelectedRecordsDataItemsProperty, value); } } public IList DeletedRecordsDataItems { get { return GetValue(DeletedRecordsDataItemsProperty) as IList; } set { SetValue(DeletedRecordsDataItemsProperty, value); } } public object UpdatedRecordDataItem { get { return GetValue(UpdatedRecordDataItemProperty) as object; } set { SetValue(UpdatedRecordDataItemProperty, value); } } public BindableXamDataGrid() { //this.SelectedRecordsDataItems = new List(); //this.DeletedRecordsDataItems = new List(); this.SelectedItems.Records.Clear(); this.ActiveRecord = null; } public bool? UseFieldLabelsForToolTips { get; set; } private FieldLayout OriginalFieldLayout { get; set; } public bool? MaintainDefaultFieldLayout { get; set; } protected override void OnFieldLayoutInitializing(Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializingEventArgs args) { base.OnFieldLayoutInitializing(args); if (this.OriginalFieldLayout == null && MaintainDefaultFieldLayout == true) { this.OriginalFieldLayout = new FieldLayout(); foreach (Field f in args.FieldLayout.Fields.Where(field => !field.AutoGenerated)) this.OriginalFieldLayout.Fields.Add(f.CloneWithNetDataSerializer()); } } protected override void OnAssigningFieldLayoutToItem(Infragistics.Windows.DataPresenter.Events.AssigningFieldLayoutToItemEventArgs args) { base.OnAssigningFieldLayoutToItem(args); } protected override void OnFieldLayoutInitialized(Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializedEventArgs args) { base.OnFieldLayoutInitialized(args); if (UseFieldLabelsForToolTips == true) foreach (Field f in args.FieldLayout.Fields) f.ToolTip = f.Label; //if (this.OriginalFieldLayout != null) //{ // var nameComparer = new FieldNameComparer(); // foreach (Field f in this.OriginalFieldLayout.Fields) // { // var foundField = args.FieldLayout.Fields.SingleOrDefault(field => nameComparer.Equals(field, f)); // if (foundField != null) // { // args.FieldLayout.Fields.Remove(foundField); // var clonedField = f.CloneWithNetDataSerializer(); // args.FieldLayout.Fields.Add(clonedField); // } // } // for (int i = this.FieldLayouts.Count - 1; i >= 0; i--) // { // var fl = this.FieldLayouts[i]; // if (fl != this.DefaultFieldLayout && fl != args.FieldLayout) // this.FieldLayouts.RemoveAt(i); // } //} } private void CopySettings(Field originalField, Field updatedField) { if (originalField.HasSettings) updatedField.Settings = originalField.Settings; // Now copy over all the dependency properties } protected override void OnSelectedItemsChanged(Infragistics.Windows.DataPresenter.Events.SelectedItemsChangedEventArgs args) { base.OnSelectedItemsChanged(args); var selectedRecords = new List(); foreach (DataRecord dr in base.SelectedItems.Records) selectedRecords.Add(dr.DataItem); this.SelectedRecordsDataItems = selectedRecords; } protected override void OnRecordActivated(Infragistics.Windows.DataPresenter.Events.RecordActivatedEventArgs args) { base.OnRecordActivated(args); var selectedRecords = new List(); var dataRec = base.ActiveRecord as DataRecord; if (dataRec != null) selectedRecords.Add(dataRec.DataItem); this.SelectedRecordsDataItems = selectedRecords; } protected override void OnRecordDeactivating(Infragistics.Windows.DataPresenter.Events.RecordDeactivatingEventArgs args) { base.OnRecordDeactivating(args); this.SelectedRecordsDataItems = new List(); } protected override void OnRecordsDeleting(Infragistics.Windows.DataPresenter.Events.RecordsDeletingEventArgs args) { base.OnRecordsDeleting(args); DeletedRecords = args.Records; } private ReadOnlyCollection DeletedRecords { get; set; } protected override void OnRecordsDeleted(Infragistics.Windows.DataPresenter.Events.RecordsDeletedEventArgs args) { base.OnRecordsDeleted(args); var confirmedDeletedRecords = new List(); foreach (DataRecord dr in DeletedRecords) confirmedDeletedRecords.Add(dr.DataItem); this.DeletedRecordsDataItems = confirmedDeletedRecords; this.SetSelectedItemsWithActiveRecord(); } private void SetSelectedItemsWithActiveRecord() { if (this.SelectedItems.Records.Count == 0 && this.ActiveRecord != null) this.SelectedItems.Records.Add(this.ActiveRecord); } protected override void OnRecordUpdating(Infragistics.Windows.DataPresenter.Events.RecordUpdatingEventArgs args) { base.OnRecordUpdating(args); if (args.Record.IsAddRecord) { // for each cell in the new record, validate it foreach (Cell c in args.Record.Cells) { var cvp = CellValuePresenter.FromCell(c); if (cvp != null) { var editor = cvp.Editor; if (!editor.IsValueValid) { c.IsActive = true; args.Action = RecordUpdatingAction.CancelUpdateRetainChanges; ExecuteCommand(DataPresenterCommands.StartEditMode); } } } } } protected override void OnRecordUpdated(Infragistics.Windows.DataPresenter.Events.RecordUpdatedEventArgs args) { base.OnRecordUpdated(args); this.UpdatedRecordDataItem = args.Record.DataItem; this.SetSelectedItemsWithActiveRecord(); } private Cell FirstVisibleCell(DataRecord dr) { if (dr != null) { foreach (Cell c in dr.Cells) if (c.Field.Visibility == System.Windows.Visibility.Visible && c.Field.DataType != typeof(bool)) return c; } return null; } public void AddNewRecord() { if (this.RecordManager.DataSourceAllowsAddNew) { Cell c = FirstVisibleCell(RecordManager.CurrentAddRecord); if (c != null) { c.IsActive = true; ExecuteCommand(DataPresenterCommands.StartEditMode); } } } public void EditCurrentRecord() { if (this.RecordManager.DataSourceAllowsEdit) { var activeCell = ActiveCell; if (activeCell == null) { DataRecord dr = ActiveRecord as DataRecord; if (dr != null) { activeCell = FirstVisibleCell(dr); activeCell.IsActive = true; } } if (activeCell != null) ExecuteCommand(DataPresenterCommands.StartEditMode); } } public void DeleteCurrentRecord() { if (this.RecordManager.DataSourceAllowsDelete) { if (SelectedItems.Records.Count == 0 && ActiveRecord != null) SelectedItems.Records.Add(ActiveRecord); ExecuteCommand(DataPresenterCommands.DeleteSelectedDataRecords); } } }