【问题标题】:WPF: How to add a table to accept user`s input in the textboxes?WPF:如何添加表格以接受用户在文本框中的输入?
【发布时间】:2019-07-30 07:31:38
【问题描述】:

我刚从 WinForms 切换到 WPF。我正在尝试添加一个像下面这样的控件的表格,它应该有列和文本框来接受用户的输入。告诉我。

我尝试使用 DataGrid/Grid/FlowControl/ListView,但它们看起来都是用于绑定数据,不是显示数据而是接受用户的输入。

图像是表格。 enter image description here

它应该接受用户的输入,并且应该能够使用 C# 动态添加更多的文本框。

【问题讨论】:

  • DataGrid 正是您正在寻找的。默认情况下单击列会显示编辑TextBox 以供用户输入。当“添加更多文本框”表示添加列或行时,只需将新数据项添加到DataGrid的源集合即可。
  • @BionicCode:我可以添加我想要的列,但不能将文本框作为行添加到网格中。我在哪里可以找到“新数据项”?我看到很多选项,令人困惑。

标签: wpf desktop-application


【解决方案1】:

问题是他自己的mentality。我建议你在做一些“严肃”的事情之前先学习MVVM

您可以使用 datagrid 轻松实现该行为。

【讨论】:

  • 是的,看起来我需要在开始开发工作之前了解 MVVM。以为它就像 WinForms 一样简单。
【解决方案2】:

这是创建与您的图像相似的表格的最简单版本。您可以使用样式来设置列和标题的样式(例如标题背景)。

TableRowData 项目在DataGrid 中显示为一行。
TableRowData 类型的每个属性都显示为DatGrid 内的行列。

class TableRowData : INotifyPropertyChanged
{
  private int serialNumber;
  public int SerialNumber
  {
    get => this.serialNumber;
    set
    {
      this.serialNumber = value;
      OnPropertyChanged();
    }
  }

  private int columnOne;
  public int ColumnOne
  {
    get => this.columnOne;
    set
    {
      this.columnOne= value;
      OnPropertyChanged();
    }
  }

  private int columnTwo;
  public int ColumnTwo
  {
    get => this.columnTwo;
    set
    {
      this.columnTwo= value;
      OnPropertyChanged();
    }
  }

  private int columnThree;
  public int ColumnThree
  {
    get => this.columnThree;
    set
    {
      this.columnThree= value;
      OnPropertyChanged();
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected virtual OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
    this.PropertyChanged?.Invoke();
  }
}

ViewModel.cs

class ViewModel : INotifyPropertyChanged
{
  public ViewModel()
  {
    this.TableRows = new ObservableCollection<TableRowData>();
  }

  // Adding a new TableRowData to the ObservableCollection will immediately add a row to the bound DataGrid
  public void AddRow()
  {
    this.TableRows.Add(new TableRowData());
  }

  private ObservableCollection<TableRowData> tableRows;
  public ObservableCollection<TableRowData> TableRows
  {
    get => this.tableRows;
    set
    {
      this.tableRows= value;
      OnPropertyChanged();
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected virtual OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
    this.PropertyChanged?.Invoke();
  }
}

MainWindow.xaml

<Window>
  <Window.DataContext>
    <ViewModel />
  </Window.DataContext>

  <StackPanel>
    <Button Click="OnAddButtonClicked" Content="Add Row" />
    <DataGrid ItemsSource="{Binding TableRows}" />
  </StackPanel>
</Window>

MainWindow.xaml.cs

partial class MainWindow : Window
{
  public MainWindow()
  {
    InitializeComponent();
  }

  private void OnAddButtonClicked(object sender, RoutedEventArgs e)
  {
    (this.DataContext as ViewModel)?.AddRow();
  }
}

理想情况下,您应该使用ICommand 而不是Button.Click 事件处理程序来调用AddRow() 方法。

【讨论】:

  • 感谢您的回答。这是当我点击一个按钮时,如果我必须默认显示一些文本框怎么办?
  • ViewModel的构造函数中将TableRows的初始化改为:this.TableRows = new ObservableCollection&lt;TableRowData&gt;() { new TableRowData() };。通过这种方式,您可以向DataGrid 添加任意数量的预定义行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多