2015-09-25 5 views
0

Я чувствую, что то, что я пытаюсь сделать, довольно просто и просто, но из исследования, которое я сделал, похоже, что я делаю все правильно. Я просто создал проект WPF в ваниле, инфраструктуру установки объекта, и теперь я пытаюсь привязать коллекцию своих сотрудников (которые имеют данные) к сетке данных.Wpf DataGrid не показывает связанные данные

XAML:

<DataGrid Name="EmployeesView" CanUserAddRows="False" CanUserResizeColumns="True" CanUserSortColumns="True" IsReadOnly="True" Margin="10,10,0,0"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" /> 
        <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" /> 
        <DataGridTextColumn Header="Phone Number" Binding="{Binding PhoneNumber}" /> 
        <DataGridTextColumn Header="Pay Rate" Binding="{Binding PayPerHour}" /> 
        <DataGridTextColumn Header="Hire Date" Binding="{Binding HireDate}" /> 
       </DataGrid.Columns> 
      </DataGrid> 

Вот моя модель:

public class Employee 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string PhoneNumber { get; set; } 
    public double PayPerHour { get; set; } 
    public DateTime HireDate { get; set; } 
} 

А вот мой код позади (не используя MVVM)

private CompanyContext db = new CompanyContext(); 
public ObservableCollection<Employee> Employees = new ObservableCollection<Employee>(); 

public AddEmployee() 
{ 
    RefreshGrid(); 
    InitializeComponent(); 
} 

private void RefreshGrid() 
{ 
    Employees = db.Employees.ToObservableCollection(); 
    EmployeesView = new DataGrid(); 
    EmployeesView.ItemsSource = Employees; 
} 

.ToObservableCollection является метод расширения, который просто отбрасывает IEnumerable до ObservableCollection Я также пробовал это с List<> , По какой-то причине я должен позвонить EmployeesView = new DataGrid(); другой мудрый EmployeesView.ItemsSource = Employees; дает null ref на EmployeesView. Может быть, я ошибаюсь? Я здесь теряю, какие-то идеи?

+0

* «Это может быть, где я ошибаюсь?» * - Да, именно здесь вы ошибаетесь. Я предполагаю, что этот код не в коде вашего взгляда? –

+0

Я могу подтвердить, что 'Сотрудники' имеет записи из базы данных – user4612487

+0

@MikeEason Это,' AddEmployee.xaml' и 'AddEmployee.xaml.cs' У меня есть форма на той же странице, и ее привязки работают нормально. – user4612487

ответ

1

Вот простой пример:

<Window x:Class="DatagridBInding.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid ItemsSource="{Binding Items}"/> 
</Grid> 

Codebehind:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private ObservableCollection<DataTableItem> _Items; 

    public ObservableCollection<DataTableItem> Items 
    { 
     get { return _Items; } 
     set 
     { 
      _Items = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Items")); 
     } 
    } 


    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 

     Items = new ObservableCollection<DataTableItem>(); 

     Task.Factory.StartNew(() => 
     { 
      Dispatcher.Invoke(() => 
      { 
       for (int i = 0; i < 10; i++) 
        Items.Add(new DataTableItem() { Data = "Data " + i }); 
      } 
     ); 
     }); 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
} 

И класс вещь:

public class DataTableItem : INotifyPropertyChanged 
{ 
    private string _Data; 

    public string Data 
    { 
     get { return _Data; } 
     set 
     { 
      _Data = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Data")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
} 

Насколько я вижу вас убежищем» t определил ваших сотрудников как публикацию c свойство. Смотрите мой пример и делайте это.

Что касается сотрудника, проверьте мой объект DataTableItem и реализацию INotifyPropertyChanged.

У вас также есть способ добавления элементов из другого потока, на случай, если вам понадобится этот сценарий при загрузке элементов из базы данных. более

Одна вещь, не обновляйте сетки, как это, но попробовать, как я сделал в моем примере выше:

Items = new ObservableCollection<DataTableItem>(); 

или

Items.Clear(); 

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

+0

Так оно и было, единственное, что я не мог использовать атрибут 'binding', использовать 'x: Name', а не огромную сделку на данный момент. – user4612487

Смежные вопросы