如何将剩余天数绑定到 DataGrid 中?

How can I bind number of days left into a DataGrid?

我正在尝试解决一个问题,我需要计算截止日期前的天数。

我正在使用 LinqToSql、WPF。

在我的 Sql 中,我有一些日期(每个人一个,(类型日期)),例如代表某项付款的最后一天。

我的问题是,如何计算每个人的剩余天数,然后如何将它们绑定到我的 DataGrid?

这是我的XAML代码

<DataGrid  Margin="58,0,0,160" Name="dgData" HorizontalAlignment="Left" Width="612" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Ime}"></DataGridTextColumn>
            <DataGridTextColumn Header="Lastname" Binding="{Binding Prezime}"></DataGridTextColumn>
            <DataGridTextColumn Header="Days left"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

这就是我填充 DataGrid 的方式

ProbaDataContext proba = new ProbaDataContext();
    
    DateTime today = DateTime.Now;
    int nmbDays;

    public MainWindow()
    {
        InitializeComponent();

        dgData.ItemsSource = proba.Radniks.ToList();

        var sourceList = dgData.ItemsSource as List<Radnik>;
        //this is the only thing i menaged to do, count all the days left
        foreach(var item in sourceList)
        {
            DateTime datum = (DateTime)item.Datum;

            nmbDays = (datum.Date - today.Date).Days;
            txtDatum.Text = nmbDays.ToString();
        }           
    }

您可以使用辅助子项 class 来填充数据网格并在那里进行计算:

    private class AuxRadnik:Radnik
    {
        public int DaysLeft
        {
            get
            {
                return (this.Datum - DateTime.Now).Days;
            }
        }
    }

然后更改您的代码以正确填充 de ItemSource:

public MainWindow()
{
    InitializeComponent();

    dgData.ItemsSource = proba.Radniks.Select(r=> new AuxRadnik 
          {Ime = r.Ime, 
           Prezime = r.Prezime, 
           Datum = r.Datum 
          }).ToList();         
}

最后绑定 XAML 部分

<DataGrid  Margin="58,0,0,160" Name="dgData" HorizontalAlignment="Left" Width="612" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Ime}"></DataGridTextColumn>
        <DataGridTextColumn Header="Lastname" Binding="{Binding Prezime}"></DataGridTextColumn>
        <DataGridTextColumn Header="Days left" Binding="{Binding DaysLeft}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

我找到了解决办法。

首先我必须确保我在 SQL 中输入的“Datum”是 DateTime(不是日期), 然后我不得不在我的数据库中再创建一个列(我将存储该天数的地方,我将其创建为 varchar 因为我想让它为负数),最后我执行了这些代码行:

dgData.ItemsSource = proba.Radniks.ToList();

            var sourceList = dgData.ItemsSource as List<Radnik>;           
                for(int i=0;i<sourceList.Count;i++)
                {
                    sourceList[i].BrojDana = (sourceList[i].Datum - DateTime.Now).Days.ToString();
                }