我有一个通过 WCF 下载大量 STE 的客户端应用程序。
使用 WPF 应用程序,用户可以从 ListBox 中选择一个实体,并通过弹出 UserControl 对其进行编辑。由于 UserControl 直接绑定到对象,因此当用户进行更改时,它当然会影响对象。
我想提供一个取消功能,它将撤消对实体所做的所有更改。
有什么想法吗?
我有一个通过 WCF 下载大量 STE 的客户端应用程序。
使用 WPF 应用程序,用户可以从 ListBox 中选择一个实体,并通过弹出 UserControl 对其进行编辑。由于 UserControl 直接绑定到对象,因此当用户进行更改时,它当然会影响对象。
我想提供一个取消功能,它将撤消对实体所做的所有更改。
有什么想法吗?
您可以保留实体的原始副本。并编辑它的克隆版本。
如果用户取消更改,您只需继续使用原始副本。
我会说,当您在绑定的 PropertyChanged 事件中使用 WPF 时,保存一个带有键 PropertyName 和值 PropertyValue 的字典。并在使用反射恢复状态后
到目前为止,我正在使用此解决方案扩展方法
using System.Collections.Generic;
using System.Reflection;
namespace WpfApplication4
{
public static class EFExtensions
{
/// <summary>
/// Rejects changes made by user
/// </summary>
/// <param name="param">Object implementing IObjectWithChangeTracker interface</param>
public static void RejectChanges(this IObjectWithChangeTracker param)
{
OriginalValuesDictionary ovd = param.ChangeTracker.OriginalValues;
PropertyInfo[] propertyInfos = (param.GetType()).GetProperties();
foreach (KeyValuePair<string, object> pair in ovd)
{
foreach (PropertyInfo property in propertyInfos)
{
if (property.Name == pair.Key && property.CanWrite)
{
property.SetValue(param, pair.Value, null);
}
}
}
}
}
}
主要代码
using System.Linq;
namespace WpfApplication4
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
using (var db = new PlatEntities())
{
PacketEPD pd = (from epd in db.PacketEPD
select epd).First();
pd.ChangeTracker.ChangeTrackingEnabled = true;
pd.EDNo = "1";
pd.RejectChanges();
}
}
}
}