TheMadMattt
TheMadMattt

Reputation: 11

How can I show content of this array of objects? WPF C#

I have objects as below:

public class FootballTeam
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }

    public virtual ICollection<TeamDate> TeamDates { get; set; }
}

public class TeamDate
{
    public int Id { get; set; }
    public DateTime date { get; set; }

    public virtual FootballTeam FootballTeam { get; set; }
}

How can I display array of FootballTeam in DataGrid in WPF?

Now data grid look like this

Upvotes: 0

Views: 514

Answers (1)

Ozgur Saklanmaz
Ozgur Saklanmaz

Reputation: 564

If you are using the MVVM pattern you can do as follows. You can create a Model (FootballTeam) as you did in the question, process this model in ViewModel and display it on your Screen.

You can find more detailed information about ObservableCollection here. You can get detailed answers from the question about binding data to DataGrid here.

Model

public class FootballTeam
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public DateTime Time { get; set; }
}

ViewModel

class MainWindowViewModel
{
    public static readonly ObservableCollection<FootballTeam> footballTeams = new ObservableCollection<FootballTeam>();

    public ICollectionView footballTeamsCollectionView { get; private set; }

    public MainWindowViewModel()
    {
        footballTeamsCollectionView = CollectionViewSource.GetDefaultView(footballTeams);

        AddTeam(1,"Juventus","Italy",DateTime.Now);
    }

    private void AddTeam(int Id, string Name, string Country, DateTime Time)
    {
        var item = new FootballTeam();
        item.Id = Id;
        item.Name = Name;
        item.Country = Country;
        item.Time = Time;
        footballTeams.Add(item);
    }
}

MainWindow.xaml

    <DataGrid AutoGenerateColumns="False" 
                  ItemsSource="{Binding footballTeamsCollectionView , IsAsync=True}"
                  IsReadOnly="True"
                  Height="480">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Id" Binding="{Binding Id}" FontWeight="Bold"/>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Country" Binding="{Binding Country}"/>
        <DataGridTextColumn Header="TeamDates" Binding="{Binding Time, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}"/>
    </DataGrid.Columns>
</DataGrid>

MainWindow.xaml.cs

public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainWindowViewModel();
    }

If you don't want to use the MVVM pattern, you can do as follows as a second option.

MainWindow.xaml.cs

        public MainWindow()
    {
        InitializeComponent();
        // DataContext = new MainWindowViewModel();
        MyDataGrid.ItemsSource = footballTeamsCollection();
    }

    private List<FootballTeam> footballTeamsCollection()
    {
        List<FootballTeam> footballTeams = new List<FootballTeam>();
        footballTeams.Add(new FootballTeam()
        {
            Id = 1,
            Name = "Juventus",
            Country = "Italy",
            Time = DateTime.Now
        }); 

        footballTeams.Add(new FootballTeam()
        {
            Id = 2,
            Name = "Tottenham",
            Country = "England",
            Time = DateTime.Now
        });

        return footballTeams;
    }

MainWindow.xaml

    <DataGrid Name="MyDataGrid"
          AutoGenerateColumns="False"
          IsReadOnly="True"
          Height="480">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Id" Binding="{Binding Id}" FontWeight="Bold"/>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Country" Binding="{Binding Country}"/>
        <DataGridTextColumn Header="TeamDates" Binding="{Binding Time, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}"/>
    </DataGrid.Columns>
</DataGrid>

Upvotes: 1

Related Questions