C#Windows Universal:无法向DataGrid动态添加项

C#Windows Universal:无法向DataGrid动态添加项,c#,uwp,datagrid,windows-10-universal,C#,Uwp,Datagrid,Windows 10 Universal,我在我的MainPage.xaml中有几个TextBoxes、一个按钮和一个控件:DataGrid项。单击该按钮时,我希望更新DataGrid,但由于某些未知原因,它无法工作 以下是MainPage.xaml的相关部分 <Button x:Name="calculateButton" Content="Calculate" HorizontalAlignment="Left" VerticalAlignment="Center" Click="calculate_click"/> &

我在我的
MainPage.xaml中有几个
TextBox
es、一个
按钮
和一个
控件:DataGrid
项。单击该按钮时,我希望更新
DataGrid
,但由于某些未知原因,它无法工作

以下是
MainPage.xaml的相关部分

<Button x:Name="calculateButton" Content="Calculate" HorizontalAlignment="Left" VerticalAlignment="Center" Click="calculate_click"/>
<!--Necessary TextBoxes above the Button-->
<controls:DataGrid x:Name="dataGrid">
</controls:DataGrid>
calculate\u click()
的for循环的最后一行中,每当循环运行到
列表中时,我都会添加项。在函数的末尾,我将
dataGrid.ItemsSource
指定为以下列表。但它所做的只是将标题添加到
DataGrid
,而不是其中的实际项目:

单击之前:

点击后:
列表
不会自动或动态更新数据

使用
ObservableCollection
实时更新您的
DataGrid

阅读这些文档以获得进一步帮助-

您的代码应该如下所示-

    public sealed partial class MainPage : Page
    {
        private ObservableCollection<TableData> Data;
        public MainPage()
        {
            this.InitializeComponent();
            Data = new ObservableCollection<TableData>();
            dataGrid.ItemsSource = Data;
        }

        private void calculate_click(object sender, RoutedEventArgs e)
        {
            int years = Convert.ToInt32(yearInput.Text) - 1;
            for (int i = 1; i <= years; ++i)
            {
                double pow = Math.Pow(1.09, years);
                double basic = Math.Round(Convert.ToDouble(basicInput.Text) * pow),
                    fbp = Math.Round(basic * Convert.ToDouble(fbpInput.Text) / 100),
                    pf = Math.Round(basic * Convert.ToDouble(pfInput.Text) / 100),
                    grat = Math.Round(basic * Convert.ToDouble(gratInput.Text) / 100);

                double inh = Math.Floor(basic + fbp), ars = Math.Round(fbp + basic + pf + grat);

                double rent = Math.Round(Convert.ToDouble(rentInput.Text) * 12),
                    food = Math.Round(Convert.ToDouble(foodInput.Text) * pow),
                    investments = Math.Round(Convert.ToDouble(investmentsInput.Text) * pow),
                    ins = 100000;

                Double cur = inh - rent - food - investments - ins;
                Data.Add(new TableData(basic, fbp, inh, ars, cur));
            }
        }
    }
公共密封部分类主页面:第页
{
私有可观测收集数据;
公共主页()
{
this.InitializeComponent();
数据=新的ObservableCollection();
dataGrid.ItemsSource=数据;
}
私有无效计算\u单击(对象发送者,路由目标e)
{
int years=Convert.ToInt32(yearInput.Text)-1;
对于(int i=1;i
现在,标题甚至出现在单击之前,但数据仍然没有显示在DataGrid中

事实上,Mahmudul Hasan的回答已经解释了所有与你的问题相关的事情。我也测试了他的代码,它确实对我有用

如果在单击“计算”按钮时仍无法更新DataGrid上的数据,则您自己的代码中可能存在一些其他问题

根据您的屏幕截图,我制作了一个简单的XAML页面,如下所示:

<StackPanel>
    <StackPanel>
        <TextBox x:Name="yearInput"></TextBox>
        <TextBox x:Name="basicInput"></TextBox>
        <TextBox x:Name="fbpInput"></TextBox>
        <TextBox x:Name="pfInput"></TextBox>
        <TextBox x:Name="gratInput"></TextBox>
        <TextBox x:Name="rentInput"></TextBox>
        <TextBox x:Name="foodInput"></TextBox>
        <TextBox x:Name="investmentsInput"></TextBox>
    </StackPanel>

    <Button x:Name="calculateButton" Content="Calculate" HorizontalAlignment="Left" VerticalAlignment="Center" Click="calculate_click" />
    <!--Necessary TextBoxes above the Button-->
    <controls:DataGrid x:Name="dataGrid">
    </controls:DataGrid>
</StackPanel>

c#代码与Mahmudul Hasan相同。请创建一个新的空白UWP项目并复制这些代码进行测试。我相信它会起作用

要使用DataGrid,您还需要安装正确的nuget软件包。请参阅以检查是否已正确安装

你甚至可以得到官方的代码样本表

之后,如果您现在能够成功地更新DataGrid上的数据,那么下一步就是了解为什么需要使用
ObservableCollection
类。您需要仔细阅读Mahmudul Hasan回复中的文档。它已经解释了所有相关的事情


在您了解了以上所有信息后,如果您是UWP的初学者,我可以给您一些关于开发UWP应用程序的建议。就像您使用DataGrid控件一样,DataGrid控件包含在中。WindowsCommunityToolkit是开源的。当您在使用此控件时遇到问题时,您可以查看其文档以查看我的建议如果您在使用此控件时做了正确的事情。您甚至可以下载整个WindowsCommunityToolkit项目来查看特定控件的源代码,以深入了解如何使用此控件。检查其源代码,您将了解控件的工作方式。这是一种可以帮助您改进程序的学习方法g开发UWP应用程序时的技能。

因此,鉴于上述
.cs
代码,只需将
列表更改为
ObservableCollection
即可自动更新
数据网格
?是的,当然。您必须添加名称空间。(这没什么大不了的!)不幸的是,这并没有起作用。仍然和问题中的一样。只添加了标题,而不是
ObservableCollection
items@Sparker0i嗨!我已经编辑了我的答案并添加了一个代码示例。请看一看。嗨,现在标题甚至在单击之前就出现了,但是数据仍然没有显示在DataGrid中。嗨,我创建了一个新的空白UWP项目,并试图复制粘贴代码。但不幸的是,只有DataGrid头出现,里面没有数据。我确信我按照此操作安装了正确的NuGet包instructions@Sparker0i请提供一个。你可以上传它并在这里发布链接。嗨,我已经将我的代码上传到@Sparker0i看到我的。它确实对我有效。你为什么说里面没有数据?@Sparker0i你正在使用windows insider预览版本。我在17763操作系统中测试了你的代码,它确实有效。请在windows反馈中心应用程序中提交此问题。
<StackPanel>
    <StackPanel>
        <TextBox x:Name="yearInput"></TextBox>
        <TextBox x:Name="basicInput"></TextBox>
        <TextBox x:Name="fbpInput"></TextBox>
        <TextBox x:Name="pfInput"></TextBox>
        <TextBox x:Name="gratInput"></TextBox>
        <TextBox x:Name="rentInput"></TextBox>
        <TextBox x:Name="foodInput"></TextBox>
        <TextBox x:Name="investmentsInput"></TextBox>
    </StackPanel>

    <Button x:Name="calculateButton" Content="Calculate" HorizontalAlignment="Left" VerticalAlignment="Center" Click="calculate_click" />
    <!--Necessary TextBoxes above the Button-->
    <controls:DataGrid x:Name="dataGrid">
    </controls:DataGrid>
</StackPanel>