О привязке DataGrid в WPF.Нет контента становится видимым.Только строки создаются - PullRequest
2 голосов
/ 11 ноября 2010

Я связал свою DataGrid в Wpf с данными. Но никакие данные не становятся видимыми для меня. Я вижу три строки, созданные в сетке в пользовательском интерфейсе, но данные не видны. Я попытался изменить передний и задний цвета. Я не знаю, почему это происходит.

Любая помощь будет заметна.

Мой код

Код позади

Я пробовал таким образом

  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 ]

3 голосов
/ 11 ноября 2010

Попробуйте взглянуть на окно вывода во время отладки - оно сообщит вам, есть ли у вас какие-либо ошибки привязки.

0 голосов
/ 11 августа 2012

Это не работает, потому что, когда вы говорите

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

вы привязываетесь к IEnumerable . Но у DataRow нет свойств, с которыми вы пытаетесь связать ячейки, таких как First_Name, Last_Name. Вам нужно использовать синтаксис индексатора для привязки к полям DataRow, например:

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

Причина, по которой это работает для dt.DefaultView, заключается в том, что DataView реализует IBindingListView и ITypedList, а DataGrid может объединять эти интерфейсы и разрешать имена свойств при его привязке.

0 голосов
/ 11 августа 2012

Мне нужно было решить эту же проблему и разработать примеры, где:

  1. DataGrid создается в XAML
  2. DataGrid создается в C # (с выделенным кодом)

Для (1) мне нужно было установить DataGrid.ItemsSource = "{Binding}" в XAML, а затем в C # установить DataGrid.DataContext в DataSet

Для (2) подход (1) не сработал. Вместо этого я пропустил настройку DataGrid.DataContext и установил DataGrid.ItemsSource = DataTable.DefaultView. Нет DataSet было необходимо.

Вот полный рабочий пример обоих:

MainWindow.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;
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...