代码之家  ›  专栏  ›  技术社区  ›  Shantanu Gupta

在WPF中绑定DataGrid。内容不可见。只创建行

  •  2
  • Shantanu Gupta  · 技术社区  · 14 年前

    任何帮助都是值得赞赏的。

    我的代码

    代码隐藏

      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>
    
    3 回复  |  直到 14 年前
        1
  •  5
  •   aligray    14 年前

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

        2
  •  0
  •   Elijah W. Gagne    12 年前

    我需要解决同样的问题,并举例说明:

    1. 这个 DataGrid 在XAML中创建
    2. 数据网格 在C#(代码隐藏)中创建

    DataGrid.ItemsSource = "{Binding}" 在XAML中,然后在C中设置 DataGrid.DataContext DataSet

    DataGrid.DataContext 并设置 DataGrid.ItemsSource = DataTable.DefaultView . 不 是需要的。

    主窗口.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>
    

    主窗口.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;
            }
    
        }
    }
    
        3
  •  0
  •   Volma    12 年前

    这不管用,因为当你说

    dgvSummary.ItemsSource = dt.AsEnumerable().ToList(); 
    

    您正在绑定到IEnumerable<DataRow>。但是DataRow没有要将单元格绑定到的属性,例如First\u Name、Last\u Name。您需要使用索引器语法绑定到DataRow字段,如下所示:

    <TextBlock Visibility="Visible"                                                  Foreground="Red"                                                 Background="Transparent" Text="{Binding Path=[First_Name]}"/> 
    

    为什么它对你有用默认视图是因为DataView实现了IBindingListView和ITypedList,DataGrid可以在绑定时互操作这些接口并解析属性名。