2013-08-20 5 views
1

я немного застрял на вопрос с WPF DataGrids, и снова мой Google Foo не удалось мне, что я хочу сделать, кажется, очень простой, но я не могу за жизнь мне проработай это.WPF - Datagrid получить новый элемент после редактирования

Пожалуйста обнажить в виду, что я использую Caliburn Micro для этого приложения

У меня есть DataGrid, который привязан к ObservableCollection<Item> элементы сами обрабатывать изменения, используя NotifyOfPropertyChange и IsDirty флаг с, поэтому редактирование этих элементов не является проблемой, однако я не могу работать, как обрабатывать новые элементы добавляются, мы используем CanUserEditRows свойство DataGrid, чтобы рядный добавление новых элементов.

Однако моя проблема возникает, когда я пытаюсь обнаружить новый элемент, добавляемый, чтобы его запустить в мои службы баз данных. Кажется, многие люди используют событие CollectionChanged для ObservableCollection, чтобы обнаружить это. Однако это кажется чтобы запустить мгновение, когда пользователь нажимает на часть данных datagrid {NewItemPlaceholder}, прежде чем какие-либо данные будут вставлены.

private void ItemList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if (e.NewItems != null) 
    { 
     foreach (Item i in e.NewItems) 
     { 
      _itemManager.Insert(i); 
     } 
    } 
} 

Это код, я использую, возможно, я сделал ошибку, но я не могу показаться, чтобы выяснить, как получить это стрелять только после редактирования закончена, к сожалению, Google, кажется, возвращается те же результаты, независимо от того, как я пытаюсь изменить свой вопрос. Надеюсь, кто-то здесь может предоставить мне относительно простой ответ на этот вопрос.

Если вам нужно больше кода, чтобы показать вам, как вещи работают (например, _itemManager) я могу предоставить в случае необходимости.

ответ

2

Это очень просто:

// instances of this type user should edit in data grid 
public class Item : IEditableObject 
{ 
    // the item identifier 
    public int Id { get; set; } 

    // some data-bound properties 

    #region IEditableObject Members 

    public void BeginEdit() 
    {    
    } 

    public void CancelEdit() 
    { 
    } 

    public void EndEdit() 
    { 
     // new items has identifier, set to 0 
     if (Id == 0) 
     { 
      // post changes here 
     } 
    } 

    #endregion 
} 

DataGrid знает о IEditableObject, и если связанный элемент данных реализует этот интерфейс, сетка вызывает соответствующие методы во время редактирования.

+0

Редактирование элемента не является моей проблемой, редактирование работает нормально, его способность указывать, когда новый элемент был добавлен в datagrid с помощью {NewItemPlaceholder} в самом файле данных, не повлияет ли ваше решение на каждое редактирование, независимо от того, является ли элемент новым или нет? – Ben

+0

«когда добавлен новый элемент» - это тривиально, так как у вас должны быть критерии для «нового элемента». Обновлен ответ. – Dennis

+0

Спасибо за ответ, это имеет смысл, однако у меня есть быстрый вопрос, функции CRUD обрабатываются _itemManager в моей модели viewmodel, теперь я рассматриваю возможность наличия свойства IsNew на моем объекте и выполнения проверки так же, как я использую IsDirty при сохранении. Тем не менее, я задавался вопросом, был ли более чистый способ, чтобы при каждом сохранении данных было необходимо проверить оба isnew и isdirty на каждый элемент. – Ben