将DataGrid的ItemsSource绑定到List

时间:2015-08-27 19:18:43

标签: c# wpf binding datagrid

我正在尝试在ListDataGrid之间创建绑定。我没有在网上找到一个非常奇怪的工作解决方案。

在我的小例子中,我使用两个List属性publicAge创建了Name个对象:

public class Person
{
    public string Name { get; set; }

    public int Age { get; set; }
}

public ObservableCollection<Person> Collection { get; set; } 

public List<Person> Persons { get; set; }

private void WindowLoaded(object sender, RoutedEventArgs e)
{

    this.Persons = new List<Person>();

    for (int i = 0; i != 35; i++)
    {
        this.Persons.Add(new Person() {Age = i, Name = i.ToString()});
    }

    this.Collection = new ObservableCollection<Person>(this.Persons);
}

XAML代码如下所示:

<Grid DataContext="{Binding ElementName=TestWindow, Path=.}">
    <DataGrid x:Name="DataGrid" ItemsSource="{Binding Collection}" />
</Grid>

或者这(两者都不起作用):

<Grid DataContext="{Binding ElementName=TestWindow, Path=.}">
        <DataGrid x:Name="DataGrid" ItemsSource="{Binding Persons}" />
</Grid>

如果我使用this.DataGrid.ItemsSource = this.Persons;我至少看到了列表中的所有项目,但每当源this.DataGrid.Items.Refresh()发生变化时我都必须List,这就是我提出问题的原因:

我做错了什么?我需要实施INotifyPropertyChanged吗?

这个问题必须非常容易回答,但理解这些机制也很棒。

3 个答案:

答案 0 :(得分:2)

经过一整天的编码,我太紧张和疲惫了。解决方案非常简单:

INotifyPropertyChanged类实施Interface Person

public class Person: INotifyPropertyChanged
{
    private string name;

    private int age;

    public string Name
    {
        get
        {
            return this.name;
        }
        set
        {
            this.name = value;
            this.OnPropertyChanged("Name");
        }
    }

    public int Age
    {
        get
        {
            return this.age;
        }
        set
        {
            this.age = value;
            this.OnPropertyChanged("Age");
        }
    }

    protected void OnPropertyChanged(string name)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

然后将数据与这些代码绑定在一起:

this.DataGrid.DataContext = this.Persons;

对于成功的Binding,您还需要这些XAML代码:

<DataGrid x:Name="DataGrid" ItemsSource="{Binding}" />

DataGrid个实例中的数据发生变化时,Person中的值现在会刷新。

答案 1 :(得分:2)

好的,所以你遇到问题的原因是因为加载窗口时会发生什么以及如何设置数据绑定。

DataGrid的ItemsSource直到Window已经加载(它在Window加载的事件中被设置)才会发生。因此,DataGrid现在不会更改ItemsSource。您可以通过添加更改为列表本身的INotiftyProperty来解决此问题,或者,您可以先创建DataGrid列表,然后只在Window加载时填充。

例如:

xaml.cs

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        x:Name="TestWindow"
        Loaded="WindowLoaded">
    <Grid DataContext="{Binding ElementName=TestWindow, Path=.}">
        <DataGrid x:Name="DataGrid" ItemsSource="{Binding Collection}" />
    </Grid>
</Window>

XAML:

%w[
autoconf 
autogen 
intltool
build-essential 
libtool    
apache2-threaded-dev  
pkg-config    
libcurl4-gnutls-dev
].each do |dep|
  package dep do
    action :install
  end
end

答案 2 :(得分:0)

我在Windows Forms Apps中使用数据网格视图做了类似的事情。所以也许这可以指出你正确的方向......我对wpf没有多少经验。

List<Connection> connList = new List<Connection>();
//populate list somehow
BindingSource bs = new BindingSource();
bs.DataSource = connList;
DataGrid.DataSource = bs;           



    public class Connection
    {
        public string Name {get; set;}
        public string Connect {get; set;}

        public Connection(string n, string c)
        {
            Name = n;
            Connect = c;
        }
    }