2017-02-14 6 views
0

У меня есть способ обновить мой DataGrid после добавления/изменения/удаления данных.Обновление DataGrid не работает, когда я использую метод из другого класса

public void EmployeesDbConnection<T>(T dbset, string collectionName, Page page) where T : class 
{ 
    CompanyManagerContext db = new CompanyManagerContext(); 

    var collectionViewSource = page.FindResource(collectionName) as CollectionViewSource; 

    db.Set<T>().Load(); 
    collectionViewSource.Source = db.Set<T>().Local; 
    collectionViewSource.View.Refresh(); 
} 

Моя проблема заключается в том, что мой метод работает только тогда, когда я использую его в том же окне/страницы, где мой DataGrid есть.

Сценарий является:

У меня есть DataGrid в EmployeePage. У меня есть ДобавитьButton в EmployeePage.

Когда я нажимаю ДобавитьButton, на дисплее он показывает новый Window (AddEmployeeWindow) с полями для ввода данных сотрудника например (имя, фамилия, дата рождения и т.д.) и добавить, сброс и отмена кнопки.

Когда я нажимаю ДобавитьButton, мои вставки данных в базу данных, но не DataGrid обновить будет.

Когда я делаю то же самое на странице сотрудника, он обновляется.

В EmployeePage я бегу метод, как это (DataGrid освежает):

dbManagement.EmployeesDbConnection(newEmployee, "CollectionViewSource", this); 

В AddWindow я бегу метод, как это (DataGrid не освежающий):

dbManagement.EmployeesDbConnection(newEmployee, "CollectionViewSource",  empPage); 

с

readonly EmployeePages empPage = new EmployeePages(); 

Его код крепления XAML:

<Page.Resources> 
    <CollectionViewSource x:Key="CollectionViewSource" d:DesignSource="{d:DesignInstance {x:Type models:Employee}, CreateList=True}"></CollectionViewSource> 
</Page.Resources> 
<DataGrid x:Name="EmployeesDataGrid" HorizontalAlignment="Left" Margin="10,355,0,0" VerticalAlignment="Top" Height="305" Width="880" 
        DataContext="{StaticResource CollectionViewSource}" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" 
        RowDetailsVisibilityMode="VisibleWhenSelected" IsReadOnly="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn x:Name="IdColumn" Header="Id" Binding="{Binding Id}"/> 
     <DataGridTextColumn x:Name="FirstNameColumn" Header="First Name" Binding="{Binding FirstName}"/> 
     <DataGridTextColumn x:Name="LastNameColumn" Header="Last Name" Binding="{Binding LastName}"/> 
     <DataGridTextColumn x:Name="MobilePhoneNumberColumn" Header="Mobile Phone" Binding="{Binding MobilePhoneNumber}"/> 
     <DataGridTextColumn x:Name="EmailAdressColumn" Header="Email" Binding="{Binding MailAdress}"/> 
     <DataGridTextColumn x:Name="EmployeedDate" Header="Employeed Date" Binding="{Binding EmployedDate}"/> 
     <DataGridTextColumn x:Name="BirthdayDate" Header="Birthday  Date" Binding="{Binding BirthDate}"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Если вы правильно применили привязки WPF, нет необходимости обновлять. Сетка будет обновляться из-за двусторонней привязки. – Prajwal

+0

@Prajwal Я отредактировал мое сообщение и добавил информацию о привязках. что с ними не так? – MadMike6661

+0

Вы не являетесь обязательным. 'ItemsSource =" {Binding} "' вы ссылаетесь на представление напрямую. – Prajwal

ответ

1

AddEmployeeWindow необходима ссылка на существующийEmployeePages. Он не должен создавать новый экземпляр этой страницы.

Вы можете вводить в окно с ссылкой на EmployeePages при ее открытии:

AddEmployeeWindow win = new AddEmployeeWindow(this); //<-- 
win.Show(); 

Не забудьте изменить конструктор AddEmployeeWindow, чтобы принять EmployeePages ссылка:

public partial class AddEmployeeWindow : Window 
{ 
    private readonly EmployeePages _empPage; 
    public AddEmployeeWindow(EmployeePages empPage) 
    { 
     _empPage = empPage; 
     InitializeComponent(); 
    } 

    //... 
    public void Refresh() 
    { 
     dbManagement.EmployeesDbConnection(newEmployee, "CollectionViewSource", _empPage); 
    } 
} 
+0

oh thats правый. я понял это, когда я возвращался домой, что я создаю новый экземпляр, и мне нужна только ссылка на старую. в любом случае спасибо за код, я буду реализовывать это, чтобы вы знали – MadMike6661