我是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文件中)
以上代码会产生以下用户界面:
正如您可能看到的那样,用户无法在表格中输入任何内容 - 数据插入没有空行。 有没有人知道如何解决这个问题?
答案 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
设置为true
,DataGrid
会自动为您的模型生成正确的列类型。
我在我的机器上测试了这些步骤并且它们正常工作。希望它可以帮助您解决问题。
答案 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;
}
}