C# 在WPF中绑定DataGrid。没有内容变得可见。仅创建行

C# 在WPF中绑定DataGrid。没有内容变得可见。仅创建行,c#,wpf,data-binding,datagrid,C#,Wpf,Data Binding,Datagrid,我用一个datatable在Wpf中绑定了我的DataGrid。但我看不到任何数据。我可以看到在UI的网格中创建了三行,但数据不可见。我试着改变前景色和背景色。我不知道为什么会这样 任何帮助都是值得的 我的代码 代码隐藏 我试过这样做 dt.AsEnumerable().ToList().ForEach(i => dgvSummary.Items.Add(i)); 而且 dgvSummary.ItemsSource = dt.AsEnumerable().ToList(); XAM

我用一个datatable在Wpf中绑定了我的DataGrid。但我看不到任何数据。我可以看到在UI的网格中创建了三行,但数据不可见。我试着改变前景色和背景色。我不知道为什么会这样

任何帮助都是值得的

我的代码

代码隐藏

我试过这样做

  dt.AsEnumerable().ToList().ForEach(i => dgvSummary.Items.Add(i));
而且

dgvSummary.ItemsSource = dt.AsEnumerable().ToList();
XAML文件

 <my:DataGrid xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" 
              Name="dgvSummary" ItemsSource="{Binding}" Grid.Row="1" 
              MinWidth="520"    Height="180"            HorizontalAlignment="Left"
              FontSize="10"     Background="#FFFEEFC8" 
              AutoGenerateColumns="False"               SelectionUnit="Cell" 
              SelectionMode="Single"                    RowBackground="Transparent">
                    <my:DataGrid.Columns>                        
                        <my:DataGridTemplateColumn Header="First Name" 
                                                   IsReadOnly="True">
                            <my:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Visibility="Visible"  
                                               Foreground="Red" 
                                               Background="Transparent" 
                                               Text="{Binding Path=First_Name}"/>
                                </DataTemplate>
                            </my:DataGridTemplateColumn.CellTemplate>
                        </my:DataGridTemplateColumn>
                        <my:DataGridTemplateColumn Header="Last Name" 
                                                   IsReadOnly="True">
                            <my:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Foreground="Black" 
                                               Text="{Binding Path=LAST_NAME}"/>
                                </DataTemplate>
                            </my:DataGridTemplateColumn.CellTemplate>
                        </my:DataGridTemplateColumn>
                       </my:DataGrid.Columns>
                </my:DataGrid>


试着在调试过程中查看输出窗口-它会告诉您是否有任何绑定错误。

我需要解决同样的问题,并给出了以下示例:

  • DataGrid
    是在XAML中创建的
  • DataGrid
    是在C#(代码隐藏)中创建的
  • 对于(1)我需要在XAML中设置
    DataGrid.ItemsSource=“{Binding}”
    ,然后在C#中设置
    DataGrid.DataContext
    DataSet

    对于(2)(1)的方法不起作用。相反,我跳过了设置
    DataGrid.DataContext
    和设置
    DataGrid.ItemsSource=DataTable.DefaultView
    。不需要
    数据集

    以下是这两个方面的完整工作示例:

    main window.xaml

    <Window x:Class="DataGridTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="60" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <StackPanel Grid.Row="0">
                <Button Content="Run1" Width="100" Click="RunGrid1_Click"></Button>
                <Button Content="Run2" Width="100" Click="RunGrid2_Click"></Button>
            </StackPanel>
            <ScrollViewer Name="sv1" Grid.Row="1">
                <DataGrid Name="dg1" ItemsSource="{Binding}"></DataGrid>
            </ScrollViewer>
        </Grid>
    </Window>
    
    
    
    MainWindow.xaml.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.Collections.ObjectModel;
    using System.Data;
    using System.Management.Automation;
    //C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll
    
    namespace DataGridTest
    {
        public partial class MainWindow : Window
        {
            string scriptText = @"$quotastat = @()
    $quotastat += new-object psobject -property @{
        Identity = 1
        Value = '0.5GB'
        IssueWarningQuota = '471860 KB'
        ProhibitSendQuota = '498074 KB'
        ProhibitSendReceiveQuota = '524288 KB'
    }
    $quotastat += new-object psobject -property @{
        Identity = 2
        Value = '1GB (default)'
        IssueWarningQuota = '943719 KB'
        ProhibitSendQuota = '996148 KB'
        ProhibitSendReceiveQuota = '1048576 KB'
    }
    $quotastat";
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void RunGrid1_Click(object sender, RoutedEventArgs e)
            {
                StringBuilder sb = new StringBuilder();
    
                PowerShell psExec = PowerShell.Create();
                psExec.AddScript(scriptText);
    
                Collection<PSObject> results;
                Collection<ErrorRecord> errors;
                results = psExec.Invoke();
                errors = psExec.Streams.Error.ReadAll();
    
                DataSet ds = new DataSet();
                DataTable dt = new DataTable();
    
                foreach (PSMemberInfo member in results[0].Members)
                {
                    if (member.MemberType == PSMemberTypes.NoteProperty)
                    {
                        dt.Columns.Add(member.Name, Type.GetType(member.TypeNameOfValue));
                    }
                }
    
                foreach (PSObject result in results)
                {
                    DataRow dr = dt.NewRow();
    
                    foreach (PSPropertyInfo pi in result.Properties)
                    {
                        dr[pi.Name] = pi.Value;
                    }
    
                    dt.Rows.Add(dr);
                }
    
                ds.Tables.Add(dt);
                dg1.DataContext = ds.Tables[0];
            }
    
    
            private void RunGrid2_Click(object sender, RoutedEventArgs e)
            {
                StringBuilder sb = new StringBuilder();
    
                PowerShell psExec = PowerShell.Create();
                psExec.AddScript(scriptText);
    
                Collection<PSObject> results;
                Collection<ErrorRecord> errors;
                results = psExec.Invoke();
                errors = psExec.Streams.Error.ReadAll();
    
                DataGrid outputGrid = new DataGrid()
                {
                    HorizontalAlignment = HorizontalAlignment.Stretch,
                    VerticalAlignment = VerticalAlignment.Stretch,
                    HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
                    VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
                };
    
                DataTable dt = new DataTable();
    
                foreach (PSMemberInfo member in results[0].Members)
                {
                    if (member.MemberType == PSMemberTypes.NoteProperty)
                    {
                        dt.Columns.Add(member.Name, Type.GetType(member.TypeNameOfValue));
                    }
                }
    
                foreach (PSObject result in results)
                {
                    DataRow dr = dt.NewRow();
    
                    foreach (PSPropertyInfo pi in result.Properties)
                    {
                        dr[pi.Name] = pi.Value;
                    }
    
                    dt.Rows.Add(dr);
                }
    
                outputGrid.ItemsSource = dt.DefaultView;
                sv1.Content = outputGrid;
            }
    
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    使用系统文本;
    使用System.Windows;
    使用System.Windows.Controls;
    使用System.Windows.Data;
    使用System.Windows.Documents;
    使用System.Windows.Input;
    使用System.Windows.Media;
    使用System.Windows.Media.Imaging;
    使用System.Windows.Navigation;
    使用System.Windows.Shapes;
    使用System.Collections.ObjectModel;
    使用系统数据;
    使用系统、管理、自动化;
    //C:\Program Files(x86)\Reference Assembly\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll
    命名空间DataGridTest
    {
    公共部分类主窗口:窗口
    {
    字符串scriptText=@“$quotastat=@()
    $quotastat+=新对象psobject-属性@{
    标识=1
    值='0.5GB'
    IssueWarningQuota='471860 KB'
    ProhibitSendQuota='498074 KB'
    ProhibitSendReceiveQuota='524288 KB'
    }
    $quotastat+=新对象psobject-属性@{
    身份=2
    值='1GB(默认值)'
    IssueWarningQuota='943719KB'
    ProhibitSendQuota='996148 KB'
    ProhibitSendReceiveQuota='1048576 KB'
    }
    $quotastat”;
    公共主窗口()
    {
    初始化组件();
    }
    私有无效RunGrid1\u单击(对象发送者,路由目标e)
    {
    StringBuilder sb=新的StringBuilder();
    PowerShell psExec=PowerShell.Create();
    psExec.AddScript(scriptText);
    收集结果;
    收集错误;
    结果=psExec.Invoke();
    errors=psExec.Streams.Error.ReadAll();
    数据集ds=新数据集();
    DataTable dt=新的DataTable();
    foreach(结果[0]中的PSMemberInfo成员。成员)
    {
    if(member.MemberType==PSMemberTypes.NoteProperty)
    {
    Add(member.Name,Type.GetType(member.TypeNameOfValue));
    }
    }
    foreach(PSObject结果生成结果)
    {
    DataRow dr=dt.NewRow();
    foreach(result.Properties中的PSPropertyInfo pi)
    {
    dr[pi.Name]=pi.Value;
    }
    dt.Rows.Add(dr);
    }
    ds.Tables.Add(dt);
    dg1.DataContext=ds.Tables[0];
    }
    私有无效RunGrid2\u单击(对象发送者,路由目标e)
    {
    StringBuilder sb=新的StringBuilder();
    PowerShell psExec=PowerShell.Create();
    psExec.AddScript(scriptText);
    收集结果;
    收集错误;
    结果=psExec.Invoke();
    errors=psExec.Streams.Error.ReadAll();
    DataGrid outputGrid=新DataGrid()
    {
    水平对齐=水平对齐。拉伸,
    垂直对齐=垂直对齐。拉伸,
    HorizontalScrollBarVisibility=ScrollBarVisibility.Auto,
    VerticalScrollBarVisibility=ScrollBarVisibility.Auto,
    };
    DataTable dt=新的DataTable();
    foreach(结果[0]中的PSMemberInfo成员。成员)
    {
    if(member.MemberType==PSMemberTypes.NoteProperty)
    {
    Add(member.Name,Type.GetType(member.TypeNameOfValue));
    }
    }
    foreach(PSObject结果生成结果)
    {
    DataRow dr=dt.NewRow();
    foreach(result.Properties中的PSPropertyInfo pi)
    {
    dr[pi.Name]=pi.Value;
    }
    dt.Rows.Add(dr);
    }
    outputGrid.ItemsSource=dt.DefaultView;
    sv1.Content=outputGrid;
    }
    }
    }
    
    它不起作用,因为当你说

    dgvSummary.ItemsSource = dt.AsEnumerable().ToList(); 
    
    您正在绑定到IEnumerable。但是DataRow没有要将单元格绑定到的属性,例如First\u Name、Last\u Name。你需要
    <TextBlock Visibility="Visible"                                                  Foreground="Red"                                                 Background="Transparent" Text="{Binding Path=[First_Name]}"/>