2010-11-28 12 views
2

ich in Code aus beliebiger Code Liste von Cs-Datei Grid in XAML binden möge meinen Datagrid binden, die in XAML-Datei mit der Sammlung ist, die sie hinter nicht im Kodex ist aber in einer cs-Dateiwollen mit hinter

Ich habe verschiedene Methoden ausprobiert, aber keinen Erfolg. Eigentlich möchte ich keinen Code in Code hinter der Datei schreiben.

Klasse-Code

public class Employee : INotifyPropertyChanged 
{    
    private int _Id; 
    private string _FirstName; 
    private string _LastName; 
    private double _Salary; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public Employee() 
    { 
    } 
    public Employee(int pId, string pFirstName, string pLastName, double pSalary) 
    { 
     Id = pId; 
     FirstName = pFirstName; 
     LastName = pLastName; 
     Salary = pSalary; 
    } 

    public int Id 
    { 
     set 
     { 
      _Id = value; 
      NotifyPropertyChanged("Id"); 
     } 
     get { return _Id; } 
    } 
    public string FirstName 
    { 
     set 
     { 
      _FirstName = value; 
      NotifyPropertyChanged("FirstName"); 
     } 
     get { return _FirstName; } 
    } 
    public string LastName 
    { 
     set 
     { 
      _LastName = value; 
      NotifyPropertyChanged("LastName"); 
     } 
     get { return _LastName; } 
    } 
    public double Salary 
    { 
     set 
     {    
      _Salary = value; 
      NotifyPropertyChanged("Salary"); 
     } 
     get { return _Salary; } 
    } 
    private void NotifyPropertyChanged(string pProperty) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(pProperty)); 
    } 
} 


public class EmployeeCollection 
{ 
    ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>(); 
    public ObservableCollection<Employee> GetEmployees() 
    { 
      lstEmp.Add(new Employee(1,"Firstname 1", "Lastname 1", 1.1)); 
      lstEmp.Add(new Employee(2, "Firstname 2", "Lastname 2", 2.2)); 
      lstEmp.Add(new Employee(3, "Firstname 3", "Lastname 3", 3.3)); 
      lstEmp.Add(new Employee(4, "Firstname 4", "Lastname 4", 4.4)); 
      lstEmp.Add(new Employee(5, "Firstname 5", "Lastname 5", 5.5)); 
      lstEmp.Add(new Employee(6, "Firstname 6", "Lastname 6", 6.6)); 

      return lstEmp; 
    } 
} 

sein XAML-Code

<my:DataGrid AutoGenerateColumns="true" Margin="20,0,68,10" Name="dataGrid2" Height="135" VerticalAlignment="Bottom" /> 
+0

die eine ungerade Design ist. Warum hat ein Mitarbeiter andere Mitarbeiter? Sollte die Methode nicht statisch sein? – svick

Antwort

0

Wenn ich die Klasse in einer Weise verändern könnte, die für mich Sinn macht, würde ich GetEmployees() auf eine statische Eigenschaft ändern . Sie könnten dann schreiben Sie doch einfach (local ist ein Namespacepräfix für den Namespace enthält Employee):

<DataGrid ItemsSource="{x:Static local:Employee.Employees}" /> 

Wenn Sie die Klasse so, wie es ist, behalten möchten, zunächst eine ObjectDataProvider als Ressource deklarieren (zB in <Window.Resources>):

<ObjectDataProvider ObjectType="local:Employee" MethodName="GetEmployees" 
    x:Key="employees" /> 

Und dann verwenden:

<DataGrid ItemsSource="{Binding Source={StaticResource employees}}" /> 
0

Was Sie tun, ist, dass Sie die Datacontext in der Code-Behind-Datei auf Ihre Datenquelle festgelegt und dann sagen Sie Ihrem Datagrid, das zu binden. Es ist wie das getan:

C#:

public MainWindow() 
     { 
      InitializeComponent(); 

      Employee emp = new Employee(); 
      DataContext = emp.GetEmployees(); 

     } 

XAML:

<DataGrid AutoGenerateColumns="true" Margin="20,0,68,10" Name="dataGrid2" Height="135" VerticalAlignment="Bottom" ItemsSource="{Binding}" /> 
+0

danke für die Antwort ... aber ich möchte keinen Code in den Code hinter der Datei, die ich in Frage Beschreibung erwähnt habe, möchte ich alles in Xaml-Datei tun. Ich weiß, dass es möglich ist, aber wie? – Azhar