我有一个DataGrid
WPF窗体上ItemsSource
属性设置为DataTable
。这个DataTable
是从SQLite表填充的,我使用填充ComboBox
的DataGridTemplateColumn
来显示其中一列。 ComboBox
正确显示 DummyClass的DisplayMember
(字符串)和SelectedValue
(int)。但是,当我从ComboBox
中选择一个值时,DataGrid
在该行旁边显示验证错误(红色感叹号)。SQLite Datagrid验证
我为ComboBox
更改了选择时添加了一个事件处理程序,以便我可以查看验证错误。验证错误如下:
无法转换值'1'。
其中'1'是ComboBox
中刚刚选择的任何索引。
什么导致此验证错误?
InitializeComponent();
DummyClassCollection = new ObservableCollection<DummyClass>();
DummyClassCollection.Add(new DummyClass() { DisplayValue = "Item1", SelectedValue = 0 });
DummyClassCollection.Add(new DummyClass() { DisplayValue = "Item2", SelectedValue = 1 });
table = new DataTable();
dgData.ItemsSource = table.DefaultView;
DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
DataTemplate dataTemplate = new DataTemplate();
FrameworkElementFactory control = new FrameworkElementFactory(typeof(ComboBox));
control.SetValue(ComboBox.ItemsSourceProperty, DummyClassCollection);
control.SetValue(ComboBox.DisplayMemberPathProperty, "DisplayValue");
control.SetValue(ComboBox.SelectedValuePathProperty, "SelectedValue");
control.AddHandler(ComboBox.SelectionChangedEvent, new SelectionChangedEventHandler(ComboBox_SelectionChanged));
Binding b = new Binding();
b.Path = new PropertyPath("tableID");
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.Mode = BindingMode.TwoWay;
control.SetBinding(ComboBox.SelectedValueProperty, b);
dataTemplate.VisualTree = control;
templateColumn.CellTemplate = dataTemplate;
//dgData.AutoGenerateColumns = false;
dgData.Columns.Add(templateColumn);
string connection = @"Data Source = " + database + "; Version=3; foreign keys=true;";
sqlc = new SQLiteConnection(connection);
sqlcmd = new SQLiteCommand("SELECT * FROM tblExample", sqlc);
adapter = new SQLiteDataAdapter(sqlcmd);
sqlcmdb = new SQLiteCommandBuilder(adapter);
adapter.InsertCommand = sqlcmdb.GetInsertCommand();
adapter.UpdateCommand = sqlcmdb.GetUpdateCommand();
adapter.DeleteCommand = sqlcmdb.GetDeleteCommand();
adapter.AcceptChangesDuringUpdate = true;
adapter.Fill(table);
templateColumn.Header = table.Columns[1].ColumnName;
这是一个更详细的描述,你如何解决我碰到的基本相同的问题,所以我将其标记为解决方案。希望只要我确实发现了这个看似微不足道的解决方案,你就不会碰壁。 – Doug