C# 将 WPF DataGrid 绑定到 DataTable
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17915840/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Binding a WPF DataGrid to a DataTable
提问by user2594672
I'm not good at English because I'm not a native speaker. I apologize if I've made mistakes in the language :)
我不擅长英语,因为我不是母语人士。如果我在语言上犯了错误,我深表歉意:)
I'm new in C# and WPF and I'm trying to bind a WPF DataGrid to a DataTable in TwoWay. Now when I edit the values in the DataGrid, data in the DataTable change correctly. When I try to fill the DataTable with the following code:
我是 C# 和 WPF 的新手,我正在尝试将 WPF DataGrid 绑定到 TwoWay 中的 DataTable。现在,当我编辑 DataGrid 中的值时,DataTable 中的数据会正确更改。当我尝试使用以下代码填充 DataTable 时:
OleDbDataAdapter adapter = new OleDbDataAdapter("a query", (a connection));
adapter.Fill(dataTable);
the code works and the DataGrid seems all right. But when I try this:
代码有效,DataGrid 似乎没问题。但是当我尝试这个时:
dataTable.Rows[0][1] = (some object);
the display value doesn't change. I try to check the values in the DataGrid in the following way:
显示值不变。我尝试通过以下方式检查 DataGrid 中的值:
MessageBox.Show((SomeDataGrid.Items[0] as DataRowView).Row[1].ToString());
and it turns out no problem. I'm wondering why the display values are like this.
事实证明没有问题。我想知道为什么显示值是这样的。
Here's my DataGrid.CellStyle in XAML:
这是我在 XAML 中的 DataGrid.CellStyle:
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridCell">
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="{TemplateBinding Background}">
<DataGridDetailsPresenter HorizontalAlignment="Stretch" VerticalAlignment="Center" Content="{TemplateBinding Content}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<!-- triggers -->
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
I've been stuck on this problem for several days. Thanks for any help!
我已经被这个问题困了好几天了。谢谢你的帮助!
回答by Brian S
Unfortunately, I don't believe the DataRow
implements INotifyPropertyChanged
or the DataTable
implements INotifyCollectionChanged
. These are the interface that tell a WPF DataBinding
to update when the underlying source value changes. So when you update the underlying DataTable
values, the Binding
is not automatically refreshed and the change won't be reflected in your DataGrid
.
不幸的是,我不相信DataRow
工具INotifyPropertyChanged
或DataTable
工具INotifyCollectionChanged
。这些是告诉 WPFDataBinding
在基础源值更改时更新的接口。因此,当您更新基础DataTable
值时,Binding
不会自动刷新并且更改不会反映在您的DataGrid
.
This linkpoints to a similar question and provides an answer. Basically, if you want your DataGrid
to recognize and update when you change values in the underlying data source, you'll need to create a custom object/objects that implement INotifyPropertyChanged
.
此链接指向一个类似的问题并提供了答案。基本上,如果您希望DataGrid
在更改基础数据源中的值时识别和更新,则需要创建一个实现INotifyPropertyChanged
.
回答by blindmeis
This works, maybe you can give some more info
这有效,也许您可以提供更多信息
viewmodel:
视图模型:
public DataTable MyDataTable { get; private set; }
//ctor
_ds = new DataSet("Test");
this.MyDataTable = _ds.Tables.Add("DT");
this.MyDataTable.Columns.Add("First");
this.MyDataTable.Columns.Add("Second");
this.MyDataTable.Rows.Add("11", "12");
this.MyDataTable.Rows.Add("21", "22");
//view is updated with this
public void UpdateTable()
{
this.MyDataTable.Rows[0][1] = "haha";
}
xaml
xml
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyDataTable}"/>
回答by samar
I am not very sure if this solution will work but it is worth a try.
我不太确定这个解决方案是否有效,但值得一试。
Instead of binding your DataGrid
to a DataTable
, try binding it to a DataView
. You can convert your DataTable
to a DataView
using DefaultView
property like
不要将您的绑定DataGrid
到 a DataTable
,而是尝试将其绑定到 a DataView
。您可以将您DataTable
的属性转换为DataView
usingDefaultView
属性,例如
DataTable dt = new DataTable();
DataView dv = dt.DefaultView;
On binding with DataView
your notification to changes in data should work both ways.
将DataView
您的通知绑定到数据更改应该双向工作。