我不擅长英语,因为我不是母语人士。如果我在语言中犯了错误,我道歉:)
我是C#和WPF的新手,我正在尝试将WPF DataGrid绑定到TwoWay中的DataTable。现在,当我编辑DataGrid中的值时,DataTable中的数据会正确更改。当我尝试使用以下代码填充DataTable时:
OleDbDataAdapter adapter = new OleDbDataAdapter("a query", (a connection));
adapter.Fill(dataTable);
代码正常,DataGrid似乎没问题。但是当我尝试这个时:
dataTable.Rows[0][1] = (some object);
显示值不会改变。我尝试以下列方式检查DataGrid中的值:
MessageBox.Show((SomeDataGrid.Items[0] as DataRowView).Row[1].ToString());
并且结果没有问题。我想知道为什么显示值是这样的。
这是我在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>
我已经被困在这个问题好几天了。谢谢你的帮助!
答案 0 :(得分:4)
这可行,也许你可以提供更多信息
视图模型:
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
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyDataTable}"/>
答案 1 :(得分:4)
我不太确定这个解决方案是否有效,但值得一试。
不要将DataGrid
绑定到DataTable
,而是尝试将其绑定到DataView
。您可以使用DataTable
属性将DataView
转换为DefaultView
,例如
DataTable dt = new DataTable();
DataView dv = dt.DefaultView;
在与DataView
绑定时,您的通知数据更改应该是双向的。
答案 2 :(得分:1)
很遗憾,我不相信DataRow
实施INotifyPropertyChanged
或DataTable
实施INotifyCollectionChanged
。这些是告知WPF DataBinding
在基础源值更改时更新的接口。因此,当您更新基础DataTable
值时,Binding
不会自动刷新,并且更改不会反映在您的DataGrid
中。
This link指出了类似的问题并提供了答案。基本上,如果您希望在更改基础数据源中的值时DataGrid
识别并更新,则需要创建实现INotifyPropertyChanged
的自定义对象/对象。