хотите связать список из файла Cs с сеткой в ​​Xaml без какого-либо кода в коде позади - PullRequest
2 голосов
/ 28 ноября 2010

Я хочу связать свою DataGrid, которая находится в файле Xaml, с коллекцией, которая находится не в коде, а в файле cs

Я пробовал разные методы, но безуспешно. На самом деле я не хочу писать какой-либо код в коде за файлом.

Код класса

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;
     }
}

его код Xaml

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

Ответы [ 2 ]

0 голосов
/ 28 ноября 2010

Если бы я мог изменить класс таким способом, который имеет для меня смысл, я бы изменил GetEmployees() на статическое свойство.Затем можно просто написать (local - это префикс пространства имен для пространства имен, содержащий Employee):

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

Если вы хотите сохранить класс таким, какой он есть, сначала объявите ObjectDataProvider какресурс (например, в <Window.Resources>):

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

И затем используйте это:

<DataGrid ItemsSource="{Binding Source={StaticResource employees}}" />
0 голосов
/ 28 ноября 2010

Что вы делаете, вы устанавливаете DataContext в файле codebehind на свой источник данных, а затем указываете свой DataGrid для привязки к этому. Это сделано так:

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}" />
...