9

我英语不好,因为我不是母语人士。如果我在语言上犯了错误,我深表歉意:)

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

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

4

3 回答 3

6

这行得通,也许你可以提供更多信息

视图模型:

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";
}

xml

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding MyDataTable}"/>
于 2013-07-29T07:22:46.383 回答
6

我不太确定这个解决方案是否有效,但值得一试。

不要将您绑定DataGrid到 a DataTable,而是尝试将其绑定到 a DataView。您可以将您的转换DataTableDataViewusingDefaultView属性,例如

DataTable dt = new DataTable();
DataView dv = dt.DefaultView;

与您的通知绑定DataView到数据更改应该双向工作。

于 2013-07-29T07:58:20.523 回答
2

不幸的是,我不相信DataRow工具INotifyPropertyChangedDataTable工具INotifyCollectionChanged。这些是告诉 WPFDataBinding在基础源值更改时进行更新的接口。因此,当您更新基础DataTable值时,Binding不会自动刷新并且更改不会反映在您的DataGrid.

此链接指向一个类似的问题并提供了答案。基本上,如果您希望DataGrid在更改底层数据源中的值时识别和更新,您需要创建一个自定义对象/对象来实现INotifyPropertyChanged.

于 2013-07-29T04:12:39.387 回答