DataGrid添加行但文本不可见

问题描述 投票:1回答:2

我试图将DataTable显示到具有两列的DataGrid上。

当我更新DataTable时,DataGrid显示新行,但单元格为空。我已经为此查看了许多不同的可能解决方案,但仍然无法显示结果。

这是我的DataGrid的xaml代码:

<DataGrid x:Name="SubjectsList" Height="500" ScrollViewer.CanContentScroll="True" AutoGenerateColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Subject" Width="2*"/>
        <DataGridTextColumn Header="Weekly" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

以下是我更新表的C#代码:

public void AddSubject(object sender, RoutedEventArgs e)
{
    Subject temp = new Subject(SubjectName.Text, Convert.ToInt32(PerWeek.Text));

    subjects.Add(temp);
    MessageBox.Show(temp.Name + " has been added");

    for(int i = 0; i < subjectsTable.Rows.Count; i++)
    {
        subjectsTable.Rows.RemoveAt(i);
    }

    foreach (Subject subject in subjects)
    {
        DataRow dataRow = subjectsTable.NewRow();
        dataRow[0] = subject.Name;
        dataRow[1] = subject.ClassesPerWeek;
        subjectsTable.Rows.Add(dataRow);
        MessageBox.Show(subject.Name);
    }

    SubjectsList.ItemsSource = subjectsTable.DefaultView;
}

在上面的代码中,SubjectsList是我的DataGrid,而subjectsTable是我的DataTable。

我尝试过以下方法:

  1. 使用DataGrid.DataContext而不是DataGrid.ItemSource
  2. 在我的xaml代码中添加了ItemSource = "{Binding Path=subjectsTable}"
  3. 尝试使用DataGrid.Items.Add(dataRow)将行添加为项目
  4. 为我的用户定义类getter的每个数据成员添加了setterSubject方法
  5. 我的所有变量,数据成员和数据结构都是公开的。

如果有人知道如何使数据可见,那么请帮助我。谢谢。

以下是我添加两个主题后会发生的事情:

Output of DataGrid

c# wpf xaml datatable datagrid
2个回答
2
投票

您需要为DataGrid中的每个列指定绑定。

绑定路径将是DataTable中列的名称。

假设你的DataTable列是这样定义的(你没有显示过,所以我只想给出一个例子):

subjectsTable.Columns.Add("NameColumn", typeof(string));
subjectsTable.Columns.Add("ClassesColumn", typeof(int));

XAML中的DataGrid列定义应如下所示:

<DataGridTextColumn Header="Subject" Width="2*" Binding="{Binding NameColumn}"/>
<DataGridTextColumn Header="Weekly" Width="*" Binding="{Binding ClassesColumn}"/>

另一种方法是将DataGrid的AutoGenerateColumns属性设置为true,并省略XAML中的列定义。但是你没有那么多的电网控制权。


1
投票

如果你想考虑使用MVVM模式(https://intellitect.com/getting-started-model-view-viewmodel-mvvm-pattern-using-windows-presentation-framework-wpf/),这是一个基本的实现:

创建ViewModel:

       public class ViewModel : INotifyPropertyChanged
       {
        public ViewModel()
        {
            CreateTestData();
            AddSubjectCommand = new Command(AddSubject);
        }

        public ICommand AddSubjectCommand { get; }

        private ObservableCollection<Subject> _subjects;
        public ObservableCollection<Subject> Subjects
        {
            get => _subjects;
            set
            {
                _subjects = value;
                OnPropertyChanged();
            }
        }

        public void AddSubject()
        {
            Subjects = new ObservableCollection<Subject>();
            DataTable subjectsTable = new DataTable();

            foreach (Subject subject in subjects)
            {
                //DataRow dataRow = subjectsTable.NewRow();
                //dataRow[0] = subject.Name;
                //dataRow[1] = subject.ClassesPerWeek;
                //subjectsTable.Rows.Add(dataRow);

                Subjects.Add(new Subject
                {
                    Name = subject.Name,
                    ClassesPerWeek = subject.ClassesPerWeek
                });
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        #region Test data

        public IList<Subject> subjects { get; set; }

        private void CreateTestData()
        {
            subjects = new List<Subject>();
            subjects.Add(new Subject { Name = "Subject 1", ClassesPerWeek = 5 });
            subjects.Add(new Subject { Name = "Subject 2", ClassesPerWeek = 10 });
        }

        #endregion
        }

你需要在这里理解的东西:

  1. ObservableCollection:https://www.c-sharpcorner.com/UploadFile/e06010/observablecollection-in-wpf/
  2. INotifyPropertyChanged:https://www.c-sharpcorner.com/article/use-inotifypropertychanged-interface-in-wpf-mvvm/
  3. ICommand:https://www.c-sharpcorner.com/UploadFile/e06010/wpf-icommand-in-mvvm/

创建实现ICommand的命令:

public class Command : ICommand
    {
        private readonly Action _action;
        private readonly bool _canExecute;

        public Command(Action action, bool canExecute = true)
        {
            _action = action;
            _canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute;
        }

        public void Execute(object parameter)
        {
            _action();
        }

        public event EventHandler CanExecuteChanged;
    }

代码隐藏(不是很干净吗?):

 public partial class MainWindow
    {
        public MainWindow()
        {
            this.InitializeComponent();
        }
    }

XAML:

<Window.DataContext>
        <local:ViewModel />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Button Content="Add Subject" Command="{Binding AddSubjectCommand}" Width="100" Height="30" HorizontalAlignment="Left" />
        <DataGrid Grid.Row="1" x:Name="SubjectsList" ItemsSource="{Binding Subjects}" Height="500" ScrollViewer.CanContentScroll="True" AutoGenerateColumns="False" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Subject" Width="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Weekly" Width="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding ClassesPerWeek}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>

请参阅以下内容:

  1. DataContext是ViewModel
  2. Grid itemssource是我的ObservableCollection
  3. Button命令绑定到ViewModel中的AddSubjectCommand

样本输出

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.