使用自定义类中的列表填充DataGrid

时间:2018-10-27 04:18:39

标签: c# wpf datagrid

我有一个带有属性的类,该属性包含一个自定义对象的列表。

// MySongs.cs
public class MySongs
{    
    public List<Song> Songs = new List<Song>();
}

MainWindow()中将填充Songs属性。

// MainWindow.xaml.cs
MySongs.Songs.Add(new Song("Hey Jude", "The Beatles"));

如何在以标题和艺术家作为标题的DataGrid中显示 MySongs.Songs 列表?

谢谢!

修改(10/27):

这是 MainWindow.xaml 中的XAML:

<Window x:Class="MySongsUI.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"
    xmlns:local="clr-namespace:MySongsUI"
    mc:Ignorable="d"
    Title="My Songs" Height="450" Width="800">

    <Grid>

        <!-- DataGrid with Songs -->
        <DataGrid x:Name="songsDataGrid" />

    </Grid>

</Window>

这是 MySongs.cs 中的C#:

using System.Collections.Generic;
using System.Linq;
using System.Collections.ObjectModel;

namespace MySongsUI
{
    public static class MySongs
    {
        public static ObservableCollection<Song> Songs = new ObservableCollection<Song>();
    }
}

这是 Song.cs 中的C#:

namespace MySongsUI
{
    public class Song
    {
        public string Title { get; set; }
        public string Artist { get; set; }

        // CONSTRUCTOR
        public Song(string title, string artist)
        {
            Title = title;
            Artist = artist;
        }
    }
}

我想我不确定使 MySongs 类在 MainWindow.xaml 的XAML中被识别的最佳方法,因此我可以将其绑定到DataGrid

谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个非常简单的示例代码,它将根据Song类的属性自动生成所有列:

<DataGrid ItemsSource="{Binding MySongs}" AutoGenerateColumns="True">
</DataGrid >

如果要自定义任何内容,则需要对其进行样式设置。

如果要在运行时进行更改,请不要忘记将列表设置为ObservableCollection,并将Song类设置为从NotificationObject继承。

希望这会有所帮助。

编辑:

这是它的外观:

MainWindlow:

<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"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <local:MainView />
</Window>

MainView.xaml.cs:

public MainView()
        {
            DataContext = new MainViewModel();
            InitializeComponent();
        }

MainView.xaml:

<DataGrid ItemsSource="{Binding local:MySongs.Songs}" AutoGenerateColumns="True">
    </DataGrid >

MainViewModel.cs:

public class MainViewModel
    {
        public MySongs MySongs { get; set; }

        public MainViewModel()
        {
            MySongs = new MySongs()
            {
                Songs = new ObservableCollection<Song>()
                {
                    new Song("Hey Jude", "The Beatles")
                }
            };
        }
    }

您将必须在MainViewModel,Song和MySongs上实现INotifyPropertyChanged,以支持数据的运行时更改。