我的情景是:
我有一个带有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();
}
当我单击“显示”按钮时,将在文本框中显示数据库中的值,如果用户更改了文本框值,则重新加载窗口时将显示新值而不是旧值。有人可以建议如何再次重新加载值并清除内存对象吗?
答案 0 :(得分:4)
Binding有两种方式:它取值并在文本框中设置它是可编辑的,如果值改变,它会更新原始对象的值......
如果您只想显示数据,可以使用Binding
中的Mode = OneTime选项{Binding Path =val1, Mode=OneTime}
这只会评估一次数据..
如果确实需要修改数据,请确保为数据源属性克隆或使用其他对象。这样就可以丢弃数据源对象(如果不再需要它)...
HTH
答案 1 :(得分:0)
我建议将一些代码放入你的取消按钮点击事件,以检查是否有任何数据已从最初加载的内容中更改,因为我假设如果他们没有单击取消,则另一个按钮将保存/确定意味着数据将被提交到数据库。
什么是coll?
如果它是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,请告诉我您正在使用的内容,并且看看我是否可以提供进一步的帮助。
答案 2 :(得分:0)
很抱歉只是为了澄清您从数据库加载集合的所有内容并填充文本框,然后用户可以修改这些值,这取决于他们是单击save / ok还是取消将分别保存或不保存更改。如果是这种情况,那么我会使用arcturus的解决方案。
我使用了我的解决方案,因为我们创建了自己的'typed'数据集,它实现了IEnumerable,使生活更轻松,而不是继续填充集合。虽然我开始希望我们使用LINQ。
答案 3 :(得分:0)
我是这样做的 - &gt;添加了一个更多的文本框,用对象的ID绑定它(只有一个对象应该在那里,因为我只有一个记录存储我的所有设置),并使用,Mode = OneTime用于所有绑定.....所以如果用户保存它将更新现有的object.Cancel现在可以工作..................... whew!
答案 4 :(得分: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>