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();
}
}
}
}