3

我的情况是:

我有一个带有 3 个数据绑定文本框的 WPF 窗口

SettingsUI : Window

<Grid Name="SettingsUIGrid1">
    <TextBox Text="{Binding val1}" ....
    <TextBox Text="{Binding val2}" ....
    <TextBox Text="{Binding val3}" ....
</Grid>

在构造函数中,我这样做:

SettingsUIGrid1.DataContext = coll[0]; // collection first value

单击取消按钮时,我关闭窗口:

private void btnCancel_Click(object sender, RoutedEventArgs e) {
Close();
}

当我单击“显示”按钮时,会在文本框中显示来自数据库的值,如果用户更改文本框值并重新加载窗口,则显示新值而不是旧值。有人可以建议如何重新加载值并清除内存中的对象吗?

4

5 回答 5

4

Binding 有两种工作方式:它获取值并将其设置为在文本框中可编辑,如果值更改,它会更新原始对象的值...

如果您只想显示数据,可以使用 Binding 中的 Mode=OneTime 选项

{Binding Path =val1, Mode=OneTime}

这只会评估一次数据..

如果您确实需要修改数据,请确保克隆或使用另一个对象作为数据源属性。这样,如果不再需要数据源对象,您可以丢弃它...

高温高压

于 2008-11-19T13:05:36.473 回答
0

好的,抱歉,只是为了澄清您从数据库加载集合并填充文本框的所有内容,然后用户可以修改这些值,具体取决于他们单击保存/确定或取消将分别保存或不保存更改。如果是这种情况,那么我会使用 arcturus 的解决方案。

我使用了我的解决方案,因为我们创建了自己的“类型化”数据集,这些数据集实现了 IEnumerable,使生活比必须继续填充集合更轻松。虽然我开始希望我们使用 LINQ。

于 2008-11-19T13:30:16.520 回答
0

我是这样做的-> 再添加一个文本框,将它与对象的 ID 绑定(应该只有一个对象,因为我只有一个存储我所有设置的记录),并使用 ,Mode=OneTime 进行所有绑定。 ....所以如果用户保存它将更新现有的对象。取消现在可以工作............哇!

于 2008-11-19T13:46:02.570 回答
0

如果您不想修改数据,可以将绑定设置为 OneWay:

<Grid Name="SettingsUIGrid1">
<TextBox Text="{Binding Path =val1, Mode=OneWay}" ....
<TextBox Text="{Binding Path =val2, Mode=OneWay}" ....
<TextBox Text="{Binding Path =val3, Mode=OneWay}" ....
</Grid>
于 2008-11-19T14:01:16.957 回答
0

我建议将一些代码放入您的取消按钮单击事件中,以检查是否有任何数据已从最初加载的数据中更改,因为我假设如果他们不单击取消,则另一个按钮将被保存/确定,这意味着数据将提交到数据库。

什么是科尔?

如果它是一个 DataTable 那么你可以使用这个:

private static bool DataRowReallyChanged(DataRow row)
    {
        if (row == null)
        {
            return false;
        }

        if (!row.HasVersion(DataRowVersion.Current) || (row.RowState == DataRowState.Unchanged))
        {
            return false;
        }

        foreach (DataColumn c in row.Table.Columns)
        {
            if (row[c, DataRowVersion.Current].ToString() != row[c, DataRowVersion.Original].ToString())
            {
                return true;
            }
        }

        return false;
    }

然后只需将调用添加到取消按钮事件中,例如:

if (DataRowReallyChanged((DataRow)SettingsUIGrid1.DataContext))
{
     ((DataRow)SettingsUIGrid1.DataContext).RejectChanges();
}

我希望这有帮助。如果您不使用 DataTable,请告诉我您正在使用什么,看看我是否可以提供进一步帮助。

于 2008-11-19T13:01:37.543 回答