如何在WPF中为用户输入创建表?

时间:2017-10-10 09:06:58

标签: wpf xaml datagrid user-input

我是WPF和XAML的新手,我一直在学习。 我正在编写一个程序,其中用户需要能够使用预定义的列将数据输入到表中,然后将其发送到数据库。但是,我无法创建允许此行为的DataGrid -

我正在使用 - XAML如下:

<Grid MinHeight="100" MinWidth="600">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="20"/>
        </Grid.ColumnDefinitions>
        <ScrollViewer Grid.Column="1" 
                      ScrollViewer.VerticalScrollBarVisibility="Auto"  
                      ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                      ScrollViewer.CanContentScroll="True">
            <DataGrid SelectionMode="Single" 
                      SelectionUnit="Cell" 
                      CanUserAddRows="True" 
                      CanUserDeleteRows="True"
                      IsReadOnly="False"
                      AutoGenerateColumns="False" 
                      ItemsSource="{Binding SimpleCollection}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Rownummer" Binding="{Binding RowNumber}"/>
                    <DataGridTextColumn Header="Navn på felt" Binding="{Binding FieldName}"/>
                    <DataGridTextColumn Header="Forretningsmæssig nøgle" Binding="{Binding BusinessKey}"/>
                    <DataGridTextColumn Header="Er der datoopl." Binding="{Binding ContainsTimestamps}"/>
                    <DataGridTextColumn Header="Er der koder, der oversættes via BAS" Binding="{Binding ContainsBASTranslatedCodes}"/>
                    <DataGridTextColumn Header="Metadata" Binding="{Binding Metadata}"/>
                    <DataGridTextColumn Header="Evt. bemærkninger" Binding="{Binding AdditionalComments}"/>
                </DataGrid.Columns>
            </DataGrid>
        </ScrollViewer>
    </Grid>
    <Grid>

绑定中使用的类:

 public class UserTable
{
    public int RowNumber { get; set; }
    public string FieldName { get; set; }
    public string BusinessKey { get; set; }
    public string ContainsTimestamps { get; set; }
    public string ContainsBASTranslatedCodes { get; set; }
    public string Metadata { get; set; }
    public string AdditionalComments { get; set; }

    public UserTable()
    {
        this.RowNumber = RowNumber;
        this.FieldName = FieldName;
        this.BusinessKey = BusinessKey;
        this.ContainsTimestamps = ContainsTimestamps;
        this.ContainsBASTranslatedCodes = ContainsBASTranslatedCodes;
        this.Metadata = Metadata;
        this.AdditionalComments = AdditionalComments;            
    }

    public UserTable(int number, string name, string key, string timestamps, string translated, string meta, string additional)
    {
        RowNumber = number;
        FieldName = name;
        BusinessKey = key;
        ContainsTimestamps = timestamps;
        ContainsBASTranslatedCodes = translated;
        Metadata = meta;
        AdditionalComments = additional;
    }
}

收藏品的创作:

private ObservableCollection<UserTable> _simpleCollection;
    public ObservableCollection<UserTable> SimpleCollection
    {
        get { return _simpleCollection ?? (_simpleCollection = new ObservableCollection<UserTable>()); }

        set { _simpleCollection = value; }
    }

(我不确定在哪里放置它 - 在上面提到的类中有它,现在在与XAML对应的.cs文件中)

以上代码会产生以下用户界面:

enter image description here

正如您可能看到的那样,用户无法在表格中输入任何内容 - 数据插入没有空行。 有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

为了能够向DataGrid添加新行,您可以创建一个ViewModel类并将ObservableCollection<T>数据集合封装在其中,就像我要向您展示一样。

为了简化事情,我们假设我们有User这样的模型:

public class User
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public string Email { get; set; } 
}

让我们创建一个简单的视图模型类:

public class UsersViewModel
{
    public UsersViewModel() 
    {
        _users = new ObservableCollection<User>();
    }

    private ObservableCollection<User> _users;
    public ObservableCollection<User> User => _users; // C# 6 feature.
}

现在我们需要创建一个UsersViewModel类的实例,并将其作为数据上下文分配给DataGrid的父元素,在我们的情况下,让它分配给MainWindow 1}}网格DataContext,我们可以在XAML或后面的代码中执行:

<Window xmlns:vm="clr-namespace:Namespace.In.Which.UsersViewModel.Lives">
    <Window.Resources>
        <vm:UsersViewModel x:Key="viewModel"></local:UsersViewModel>
    </Window.Resources>
    <Grid x:Name="mainGrid" DataContext="{StaticResource viewModel}"></Grid>
    ...
</Window>

或者你可以在这样的代码中做同样的事情:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        mainGrid.DataContext = new UsersViewModel();
    }
}

之后,您需要将Users UserViewModel属性绑定到DataGrid.ItemsSource属性:

<DataGrid ... 
          ItemsSource="{Binding Users}"></DataGrid>

现在,如果您运行应用程序,最终会得到一个可编辑的DataGrid

您可以将AutoGenerateColumns设置为trueDataGrid会自动为您的模型生成正确的列类型。

我在我的机器上测试了这些步骤并且它们正常工作。希望它可以帮助您解决问题。

答案 1 :(得分:1)

要让用户能够在DataGrid中添加项目,您的UserTable类必须定义默认的无参数构造函数。

因此,您必须定义一个或删除接受参数的其他构造函数:

public class UserTable
{
    public int RowNumber { get; set; }
    public string FieldName { get; set; }
    public string BusinessKey { get; set; }
    public string ContainsTimestamps { get; set; }
    public string ContainsBASTranslatedCodes { get; set; }
    public string Metadata { get; set; }
    public string AdditionalComments { get; set; }

    public UserTable() { } //<--

    public UserTable(int number, string name, string key, string timestamps, string translated, string meta, string additional)
    {
        RowNumber = number;
        FieldName = name;
        BusinessKey = key;
        ContainsTimestamps = timestamps;
        ContainsBASTranslatedCodes = translated;
        Metadata = meta;
        AdditionalComments = additional;
    }
}