Автоматическое обновление сетки данных при изменении таблицы - PullRequest
0 голосов
/ 03 июля 2018

Не бросайте в меня камни - я новичок в программировании.

Основной вопрос - как автоматически обновлять сетку данных, которая представляет таблицу SQL с помощью Enity Framework, после каждого изменения в этой таблице?

Я создаю простое приложение с WPF для работы с таблицами SQL с помощью Entity Framework 6. В этом приложении есть изображение:

part of my application

Итак, есть датагрид, который выглядит так:

<DataGrid CanUserAddRows="False" AutoGenerateColumns="False" x:Name="variableAssignmentDataGrid" ItemsSource="{Binding VariableAssignment,UpdateSourceTrigger=PropertyChanged}" Margin="30" >
    <DataGrid.Columns>
        <DataGridTextColumn Width="1*" Binding="{Binding Id}" Header="Id" IsReadOnly="True"  />
        <DataGridTextColumn Width="1*" Binding="{Binding IdMachine}" Header="IdMachine"/>
        <DataGridTextColumn Width="1*" Binding="{Binding IdVariable}" Header="IdVariable"/>
        <DataGridTextColumn Width="1*" Binding="{Binding IdUser}" Header="Id User"/>
        <DataGridTextColumn Width="1*" Binding="{Binding Variable.Name}" Header="Name"/>
        <DataGridTextColumn Width="1*" Binding="{Binding Subscription}" Header="Subscription"/>
        <DataGridTextColumn Width="1*" Binding="{Binding Frequency}" Header="Frequency"/>
        <DataGridCheckBoxColumn Width="1*" Binding="{Binding Enable,Mode=TwoWay}" Header="Enable"/>
        <DataGridTextColumn Width="1.75*" Binding="{Binding Time}" Header="Time" FontSize="8"/>
        <DataGridTemplateColumn Width="1*" Header="Modify" />
    </DataGrid.Columns>
</DataGrid>

VariableAssignment, который используется для привязки, выглядит следующим образом:

public class DataManager : INotifyPropertyChanged
{
    public Entities context = new Entities();
    private ObservableCollection<VariableAssignment> variableAssignment;
    public ObservableCollection<VariableAssignment> VariableAssignment
    {
        get { return variableAssignment; }
        set { variableAssignment = value; OnPropertyChanged("VariableAssignment"); }
    }
  ..}

В конструкторе этого класса я заполняю VariableAssignment элементами из таблицы SQL (context.VariableAssignments)

public DataManager()
{
    VariableAssignment = new ObservableCollection<VariableAssignment>(context.VariableAssignments);
    newVariableAssignment = new VariableAssignment();
}

Как вы можете видеть, в этом конструкторе я определил newVariableAssignment = new VariableAssignment (); - это нужно для добавления новых строк в мои таблицы SQL.

Метод добавления здесь

public void addNewVariableAssignment(..)
{
    context.VariableAssignments.Add(newVariableAssignment); 


    newVariableAssignment.IdVariable = //adding values

    context.SaveChanges(); 
}

Этот метод работает после нажатия на кнопку добавления.

private void addVariableButton_Click(object sender, RoutedEventArgs e)
{
    dataManager.addNewVariable(..);
}

После нажатия кнопки ADD - строка добавляется в таблицу SQL, но моя сетка данных не обновляется. Как видите, я попробовал UpdateSourceTrigger, но по какой-то причине он не работает. Я нашел единственный способ обновить сетку данных - создать новую коллекцию ObservableCollection моей таблицы и поместить ее в ItemsSource таблицы данных после нажатия кнопки (см. Ниже)

private void addVariableButton_Click(object sender, RoutedEventArgs e)
{
    dataManager.addNewVariable(addNameVariableTextBox.Text, addAddressTexBox.Text, addVariableTypeComboBox.Text, addSourceTypeAddComboBox.Text);

    var varAssignSource = new ObservableCollection<VariableAssignment>(dataManager.context.VariableAssignments);
    variableAssignmentDataGrid.ItemsSource = varAssignSource;
}

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

Так что вы можете дать мне несколько советов?

1 Ответ

0 голосов
/ 03 июля 2018

добавить объект Assignment не только в контекст БД, но и в ObservableCollection одновременно.

public void addNewVariableAssignment()
{
    newVariableAssignment = new VariableAssignment();
    newVariableAssignment.IdVariable = //adding values

    context.VariableAssignments.Add(newVariableAssignment); 

    context.SaveChanges(); 

    VariableAssignments.Add(newVariableAssignment);
}

DataGrid будет уведомлен о добавленных новых элементах, поскольку ObservableCollection реализует INotifyCollectionChanged. Нет необходимости повторно сбрасывать ItemsSource

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...