将WPF DataGrid绑定到DataTable

时间:2013-07-29 03:58:11

标签: c# wpf binding datagrid

我不擅长英语,因为我不是母语人士。如果我在语言中犯了错误,我道歉:)

我是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>

我已经被困在这个问题好几天了。谢谢你的帮助!

3 个答案:

答案 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实施INotifyPropertyChangedDataTable实施INotifyCollectionChanged。这些是告知WPF DataBinding在基础源值更改时更新的接口。因此,当您更新基础DataTable值时,Binding不会自动刷新,并且更改不会反映在您的DataGrid中。

This link指出了类似的问题并提供了答案。基本上,如果您希望在更改基础数据源中的值时DataGrid识别并更新,则需要创建实现INotifyPropertyChanged的自定义对象/对象。