2014-10-28 5 views
0

Я использую WPF. , , DataGrid привязывается к базе данных с помощью перетаскивания VisualStudio IDE и падения, и нашел способ, чтобы мое обновление DataGrid и добавить в базу данных в режиме реального времени, используя событие RowEditEnding таким образом:WPF DataGrid RowEditEnding Событие для вызова Обновление

private void Update_WatchList(object sender, DataGridRowEditEndingEventArgs e) 
{ 
    UpdateWatchList(); 
} 

private void UpdateWatchList() 
{ 
    dsDocControlTableAdapters.DocumentWatchListTableAdapter ta = new dsDocControlTableAdapters.DocumentWatchListTableAdapter(); 
    try 
    { 
     DataRowView dr = (DataRowView)documentWatchListDataGrid.SelectedItem; 
     dsDocControl.DocumentWatchListRow dr1 = (dsDocControl.DocumentWatchListRow)dr.Row; 
     dr1.EndEdit(); 
     if (dr1.RowState == DataRowState.Detached) 
      dsDocControl.DocumentWatchList.AddDocumentWatchListRow(dr1); 
     ta.Update(dr1); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error UpdateWatchList:\n" + ex.Message); 
    } 
} 

Это стало результатом долгих проб и ошибка (в течение которого я пропустил, перенесен и снова пропустил назначение на стоматологию), но каким-то образом наткнулся на необходимость вызова EndEdit() в строке для обновления RowState до модификации или отсоединения. Является ли это ожидаемой последовательностью операций для того, что кажется очень нормальным вариантом использования, или есть лучший способ сделать это?

я начал идти по пути добавления обработчика событий CollectionChanged для добавленных строк, но не мог заставить его работать, вероятно, потому, что я не правильно использовать ObservableCollection:

private void documentWatchListDataGrid_Loaded(object sender, RoutedEventArgs e) 
{ 
    var dg = (DataGrid)sender; 
    if(dg==null || dg.ItemsSource == null) return; 

    var sourceCollection = dg.ItemsSource as ObservableCollection<DataRow>; 
    if (sourceCollection == null) return; 
    //sourceCollection.CollectionChanged += new NotifyCollectionChangedEventHandler(Update_WatchList); // never gets called 
} 

Линия, добавляет, что обработчик закомментирован, потому что я использовал обработчик как RowEditEnding (в первом блоке кода), но независимо от того, что он никогда не относится к этой точке, потому что sourceCollection всегда был нулевым.

Мой вопрос в том, какова наилучшая практика для этого, казалось бы, простой вещи: обновление в реальном времени, поскольку каждая строка изменяется или добавляется в элемент управления WPat datagrid?

ответ

2

Является ли это ожидаемой последовательностью операций для того, что кажется очень нормальным вариантом использования, или есть лучший способ сделать это?

Нет, это не обычный метод работы с DataGrids в WPF. Похоже, что это нормально для WinForms, но не для WPF. :)

Типичный способ связывания DataGrid.ItemsSouce заключается в создании класса, который наследует INotifyPropertyChanged для представления каждой строки данных, и связывает DataGrid.ItemsSource к ObservableCollection<T> этого класс

Например, вы можете иметь что-то вроде

public class WatchListModel : INotifyPropertyChanged 
{ 
    // Whatever properties here 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

Этот класс должен реализовать INotifyPropertyChanged, а свойства должны поднять уведомления об изменениях, однако я оставил его для простоты. Если вам нужен пример, проверьте here.

Тогда вы бы иметь ObservableCollection<WatchListModel>, что вы бы связывание ваш DataGrid.ItemsSource слишком

public ObservableCollection<WatchListModel> WatchListCollection { get; set; } 

и

<DataGrid ItemsSource="{Binding WatchListCollection}" ... /> 

И если вы хотите, обновления в реальном времени, вы бы добавить коллекцию изменен обработчик события для WatchListCollection для обработки добавления/удаления и добавления обработчика свойств к каждому элементу для обработки, когда его модифицированный

public MyViewModel() 
{ 
    WatchListCollection = new ObservableCollection<WatchListModel>(); 

    // Hook up initial changed handler. Could also be done in setter 
    WatchListCollection.CollectionChanged += WatchListCollection_CollectionChanged; 
} 

void WatchListCollection_CollectionChanged(object sender, CollectionChangedEventArgs e) 
{ 
    // if new itmes get added, attach change handlers to them 
    if (e.NewItems != null) 
     foreach(WatchListModel item in e.NewItems) 
      item.PropertyChanged += WatchListModel_PropertyChanged; 

    // if items got removed, detach change handlers 
    if (e.OldItems != null) 
     foreach(WatchListModel item in e.OldItems) 
      item.PropertyChanged -= WatchListModel_PropertyChanged; 

    // Process Add/Remove here 
} 

void WatchListModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    // Process Update here 
} 

Это будет правильный способ WPF сделать это :)

+0

Интересно, я создам новый проект WPF, чтобы играть с тем, что вы наметили. Это все еще греческий для меня, но я начинаю делать некоторые связи.Однако, когда вы говорите, что это типично, почему это не так, как среда IDE создает и реализует объекты с созданием набора данных «перетаскивание»? IOW, кажется, что для того, чтобы реализовать этот метод (лучший способ сделать что-то), вы не полагаетесь на идеал делать что-либо помимо компиляции и отладки: которая мне нравится (я режу зубы на Xt/Xm Motif на Unix-системах мой идеал был vi), но крутой кривой обучения. –

+0

Один большой вопрос для меня - это то, как функции TableAdapter воспроизводятся в модели, описанной выше. Другой - это IDE, который сопоставляет datagrid с ресурсом ViewSource, который обрабатывает презентацию. Но все это изменяется (кажется) с использованием привязки ObservableCollection. Поскольку я действительно не понимаю, как все это работает в модели, которую я получил, я не совсем уверен, как даже рассказать о моих вопросах. Поэтому я буду продолжать читать и экспериментировать. Спасибо за помощь :) –

+1

@PaulGibson Я бы очень рекомендовал учиться использовать шаблон MVVM с самого начала. Он хорошо подходит для WPF и делает жизнь намного проще. Также, если вам интересно, мне нравится вести блог о WPF для новичков, и вы можете найти резюме новых сообщений в этом ответе, если хотите: [Переход из Windows Forms в WPF] (http://stackoverflow.com/a/15684569/302677) – Rachel